加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 01:38:55 所属栏目:大数据 来源:网络整理
导读:在我的项目中,我有一个域层,它基本上是POJO和一个位于域层顶部的Spring控制器/服务层.我还有一个位于服务和域之间的AOP层. 我的域层正在抛出业务异常,这些异常现在正在服务层中处理. 但是我想更改它,以便在AOP层中处理从域层抛出的异常. AOP层会出现某种错误

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

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

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

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

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

@Aspect
@Component
public class MyAspect{

    private static final Logger LOGGER = LoggerFactory.getLogger(MyAspect.class);

    @Pointcut("execution(* com.linda.dao.strategy.*.*(..))")
    public void strategyMethods() { }

    @Pointcut("execution(* com.linda.controller.*.*(..)) || execution(* com.linda.Manager.*(..))")
    public void controllerMethods(){  }

    @Around("strategyMethods()")
    public Object profileStrategyMethods(ProceedingJoinPoint pjp) throws Throwable {

        long start = System.currentTimeMillis();
        Object output = null;
        LOGGER.info("Class:"+pjp.getTarget().getClass()+" entry -> method ->"+pjp.getSignature().getName());
        try{
            output = pjp.proceed();
            long elapsedTime = System.currentTimeMillis() - start;
            LOGGER.info("Method execution time: " + elapsedTime + " milliseconds.");
            LOGGER.info("Class:"+pjp.getTarget().getClass()+" exit -> method ->"+pjp.getSignature().getName());
        }catch(Throwable t){
            throw new InternalServerException(t.getMessage());  
        }

        return output;
    }

    @AfterThrowing(pointcut="execution(* com.linda.dao.strategy.*.*(..)) || execution(* com.linda.controller.*.*(..)) || execution(* com.linda.Manager.*(..))",throwing = "ex")
    public void doRecoveryActions(JoinPoint joinPoint,Throwable ex) {

        Signature signature = joinPoint.getSignature();
        String methodName = signature.getName();
        String stuff = signature.toString();
        String arguments = Arrays.toString(joinPoint.getArgs());
        LOGGER.error("Write something in the log... We have caught exception in method: "
                + methodName + " with arguments "
                + arguments + "nand the full toString: " + stuff + "nthe exception is: "
                + ex.getMessage());
    }
}

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

@ControllerAdvice
public class ExceptionLogAdvice {

    @ExceptionHandler(InternalServerException.class)
    @ResponseStatus(HttpStatus.BAD_GATEWAY)
    @ResponseBody
    public ResponseEntity

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读