저는 스프링 부트와 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
메서드가 호출되지 않습니다. 시각. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?
정보가 충분하지 않습니다. 스프링 배관 (application-context, javaconfig ...)을 공유 할 수 있습니까? – Sanj
실제로 'Spring-Boot'를 사용하므로 설정이 없습니다. 나는 build.gradle에 compile ("org.aspectj : aspectjweaver : 1.8.8")에서만 gradle 의존성을 포함했다. 다른 두 개의 '@before'와 '@after'pointcut은 잘 작동합니다. –
메서드는 예외를 throw하지 않습니다. "try-catch"블록은 기본적으로 예외를 흡수합니다. 이동 "정수 n = 10/0;" try-catch 바깥 쪽. – Sanj