私はSpring-bootとAOPの新機能です。 spring-boot
アプリケーションで発生した例外をログに記録しようとしています。正確に何をしようとしているのは、アプリケーションクラス内のメソッドがランタイム例外を発生させるたびに、コンソールにログを記録しているときです。spring-boot- @AfterThrowingは例外がスローされましたが、アドバイスメソッドを実行していませんか?
私は@AfterThrowing
注釈でアスペクトを作成しました。それが動作しているかどうかを確認するために、私は意図的に/ by zero
例外を発生させるコード行を書いています。私はそれをテストしましたが、このアドバイス方法は機能しません。続き
は私のテストコードです:
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
メソッドが呼び出されません時間。誰が私が間違っているのか教えてくれますか?
春の配管(アプリケーションコンテキスト、javaconfig ...)を共有できますか? – Sanj
実際には私は 'Spring-Boot'を使用しているため、設定が行われていません。私はbuild.gradle、compile( "org.aspectj:aspectjweaver:1.8.8")でgradle依存性のみを含んでいました。他の2つの '@before'と '@after'のポイントカットはうまく動作しています。 –
メソッドは例外をスローしません。 "try-catch"ブロックは基本的に例外を吸収します。移動 "整数n = 10/0;" try-catchの外側にあります。 – Sanj