当前位置: 首页 > 知识库问答 >
问题:

spring AOP+Aspectj的异常处理

唐高朗
2023-03-14

但是,我想改变它,这样从域层抛出的异常将在AOP层中处理。AOP层会产生某种错误响应,并将其发送回spring控制器/web服务层。

我可以创建一个IBizResponse并创建它的两个子类/接口,可能是SuccessResponse和ErrorResponse,并使域层方法返回IBizResponse。但是,我不知道如何使AOP将ErrorResponse对象返回到服务层。

共有1个答案

郁鸿博
2023-03-14

我遇到了相同的场景,在任何异常处理的情况下,我必须返回一个错误响应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<Object> handleValidationException(final InternalServerException internalServerException){

        ErrorResponseDTO dto = constructErrorResponse(internalServerException);
        return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(dto);
    }
}

修改了一些代码,因为我不能共享实际的代码。希望我把概念讲清楚了。

 类似资料:
  • 问题内容: 在我的项目中,我有一个域层(基本上是POJO)和一个位于域层顶部的Spring控制器/服务层。我还有一个位于服务和域之间的AOP层。 我的域层正在引发业务异常,这些异常现在正在服务层中进行处理。 但是我想更改它,以便从域层引发的异常将在AOP层中处理。AOP层将发生某种错误响应,并将其发送回spring控制器/ Web服务层。 我可以创建一个IBizResponse并为其创建两个子类/

  • Java+Spring+Maven应用程序: 有人能给我提供链接或者建议我一个纯AspectJ实现,不使用基于代理的Spring AOP吗? 如果我试图从同一中的访问,则不支持此操作。 我想知道:1)如何用切入点编写一个支持类内方法调用的aspectj?2)如何将其配置到我当前的Spring,maven项目中,使用aspectj加载时编织?3)如何配置aspectj maven插件,以便在Tomc

  • 问题内容: 我正在尝试在某些特定异常发生时添加一些监视。例如,如果我有这样的一个方面: 和测试类: 作为输出,我将得到: 我想知道是否有办法在引发异常后立即拦截方法执行,在建议中做点什么,然后继续在相应的catch块中执行代码?这样,如果我打电话给我,我会得到: 问题答案: 是的你可以。您需要切入点: 假设类在包中,则日志输出: 更新: 如果您想知道异常处理程序的位置,有一个简单的方法:使用封闭的

  • 我正在尝试在发生特定异常时添加一些监视。例如,如果我有这样一个方面: 和测试等级: 作为输出,我将得到: 我想知道是否有办法在抛出异常之后拦截方法执行,在我的建议中做些什么,然后继续在相应的catch块中执行代码?因此,如果我调用我可以得到:

  • 我最近开始研究并编写了一个用于日志记录的简单方面。 null https://stackoverflow.com/questions/33164216/load-time-weaving-with-aspectj-in-jboss-as-7-1

  • 本文向大家介绍浅谈java异常处理(父子异常的处理),包括了浅谈java异常处理(父子异常的处理)的使用技巧和注意事项,需要的朋友参考一下 我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”。那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习《Thinking in Ja