java – 通过Spring AOP Aspectj进行异常处理

前端之家收集整理的这篇文章主要介绍了java – 通过Spring AOP Aspectj进行异常处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在我的项目中,我有一个域层,它基本上是POJO和一个位于域层顶部的Spring控制器/服务层.我还有一个位于服务和域之间的AOP层.

我的域层正在抛出业务异常,这些异常现在正在服务层中处理.

但是我想更改它,以便在AOP层中处理从域层抛出的异常. AOP层会出现某种错误响应,并将其发送回Spring控制器/ Web服务层.

我可以创建一个IBizResponse并创建它的两个子类/接口,也许是SuccessResponse和ErrorResponse,并使我的域层方法返回IBizResponse.但是,我无法弄清楚如何使AOP将ErrorResponse对象返回到服务层.

最佳答案
我遇到了同样的情况,我必须在任何异常处理的情况下返回错误响应DTO.在@Aspect类中,

  1. @Aspect
  2. @Component
  3. public class MyAspect{
  4. private static final Logger LOGGER = LoggerFactory.getLogger(MyAspect.class);
  5. @Pointcut("execution(* com.linda.dao.strategy.*.*(..))")
  6. public void strategyMethods() { }
  7. @Pointcut("execution(* com.linda.controller.*.*(..)) || execution(* com.linda.Manager.*(..))")
  8. public void controllerMethods(){ }
  9. @Around("strategyMethods()")
  10. public Object profileStrategyMethods(ProceedingJoinPoint pjp) throws Throwable {
  11. long start = System.currentTimeMillis();
  12. Object output = null;
  13. LOGGER.info("Class:"+pjp.getTarget().getClass()+" entry -> method ->"+pjp.getSignature().getName());
  14. try{
  15. output = pjp.proceed();
  16. long elapsedTime = System.currentTimeMillis() - start;
  17. LOGGER.info("Method execution time: " + elapsedTime + " milliseconds.");
  18. LOGGER.info("Class:"+pjp.getTarget().getClass()+" exit -> method ->"+pjp.getSignature().getName());
  19. }catch(Throwable t){
  20. throw new InternalServerException(t.getMessage());
  21. }
  22. return output;
  23. }
  24. @AfterThrowing(pointcut="execution(* com.linda.dao.strategy.*.*(..)) || execution(* com.linda.controller.*.*(..)) || execution(* com.linda.Manager.*(..))",throwing = "ex")
  25. public void doRecoveryActions(JoinPoint joinPoint,Throwable ex) {
  26. Signature signature = joinPoint.getSignature();
  27. String methodName = signature.getName();
  28. String stuff = signature.toString();
  29. String arguments = Arrays.toString(joinPoint.getArgs());
  30. LOGGER.error("Write something in the log... We have caught exception in method: "
  31. + methodName + " with arguments "
  32. + arguments + "\nand the full toString: " + stuff + "\nthe exception is: "
  33. + ex.getMessage());
  34. }
  35. }

为下面的异常处理定义了另一个类:

  1. @ControllerAdvice
  2. public class ExceptionLogAdvice {
  3. @ExceptionHandler(InternalServerException.class)
  4. @ResponseStatus(HttpStatus.BAD_GATEWAY)
  5. @ResponseBody
  6. public ResponseEntity

由于我无法共享实际代码,因此稍微发布了代码.希望我明白这个概念.

猜你在找的Spring相关文章