2017-11-25 35 views
0

저는 스프링 부트와 AOP를 처음 사용합니다. 내 spring-boot 응용 프로그램에서 제기 된 예외를 기록하려고합니다. 정확히 내가 뭘 하려는지 내 응용 프로그램 클래스의 모든 메서드는 런타임 예외를 발생시킬 때마다, 나는 콘솔에 그것을 로깅 오전.예외가 발생했지만 spring-boot- @AfterThrowing이 advice 메소드를 실행하지 않습니까?

그래서 @AfterThrowing 주석이있는 특성을 만들었습니다. 작동하는지 확인하려면 의도적으로 예외 코드를 작성하여 / by zero 예외를 발생시킵니다. 나는 그것으로 테스트했지만이 advice 메소드는 작동하지 않는다. 다음

내 테스트 코드입니다 : 내가 울부 짖는 소리와 같은 포인트 컷 표현의 여러 순열을 시도

package com.sware.SpringBoot_JPA_MySQL_Gradle_Project.aspects; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.springframework.stereotype.Component; 

import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User; 

@Aspect 
@Component 
public class UserAspect { 


    @Before("execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.UserService.saveUserToDb(com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User)) && args(user)") 
    public void beforeUserSave(User user) { 
     System.out.println("++++++++++++++++++++++++++++++Creating UserBefore Pointcut: \n"+user.toString()); 

    } 



    @After("execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.UserService.saveUserToDb(com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User)) && args(user)") 
     public void aftereUserSave(User user) { 
     System.out.println("++++++++++++++++++++++++++++++Creating User After pointcut: \n"+user.toString()); 

     } 

    @AfterThrowing(pointcut = "execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.*.*(..))", throwing = "e") 
    public void myAfterThrowing(JoinPoint joinPoint, Throwable e) { 

     System.out.println("Okay - we're in the handler..."); 

     /*Signature signature = joinPoint.getSignature(); 
     String methodName = signature.getName(); 
     String stuff = signature.toString(); 
     String arguments = Arrays.toString(joinPoint.getArgs()); 
    System.out.println("**************************EXCEPTION: " 
      + methodName + " with arguments " 
      + arguments + "\nand the full toString: " + stuff + "\nthe exception is: " 
      + e.getMessage());*/ 
    } 
} 

, 그러나 아무도는 작동하지 않습니다 :

@AfterThrowing(pointcut = "execution(* com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services.*.*(..))", throwing = "e") 
@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "e") // Application fails to start throws some internal null pointer exception 
@AfterThrowing(pointcut = "execution(* com.sware.*.*.*.*(..))", throwing = "e") 

내 클래스 코드 :

package com.sware.SpringBoot_JPA_MySQL_Gradle_Project.services; 
    import java.util.ArrayList; 
    import java.util.Collection; 
    import java.util.Date; 
    import java.util.List; 
    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.stereotype.Service; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.domains.User; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.projections.UserWithFnameAndLname; 
    import com.sware.SpringBoot_JPA_MySQL_Gradle_Project.repositories.UserRepository; 

    @Service 
    public class UserService { 
     @Autowired 
     UserRepository userRepository; 
     public List<User> getAllUsers(){ 

      List<User> userList=new ArrayList<>(); 
      try { 
       Integer n=10/0; 
       userList=userRepository.findAll(); 

      } catch (Exception e) { 
       System.out.println("Exception in UserRepostory:"+e.getMessage()); 
      } 
      return userList; 
     } 
    } 

실행시 /by zero이 발생하지만 myAfterThrowing 메서드가 호출되지 않습니다. 시각. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?

+0

정보가 충분하지 않습니다. 스프링 배관 (application-context, javaconfig ...)을 공유 할 수 있습니까? – Sanj

+0

실제로 'Spring-Boot'를 사용하므로 설정이 없습니다. 나는 build.gradle에 compile ("org.aspectj : aspectjweaver : 1.8.8")에서만 gradle 의존성을 포함했다. 다른 두 개의 '@before'와 '@after'pointcut은 잘 작동합니다. –

+1

메서드는 예외를 throw하지 않습니다. "try-catch"블록은 기본적으로 예외를 흡수합니다. 이동 "정수 n = 10/0;" try-catch 바깥 쪽. – Sanj

답변

0

메서드는 예외를 throw하지 않습니다. "try-catch"블록은 기본적으로 예외를 흡수합니다. "Integer n=10/0;"을 try-catch 외부로 이동하십시오.