当前位置: 首页 > 面试题库 >

通过Spring AOP + Aspectj进行异常处理

姬天宇
2023-03-14
问题内容

在我的项目中,我有一个域层(基本上是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<Object> handleValidationException(final InternalServerException internalServerException){

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

由于我无法共享实际的代码,因此对代码进行了一些调整。希望我能阐明这个概念。



 类似资料:
  • 但是,我想改变它,这样从域层抛出的异常将在AOP层中处理。AOP层会产生某种错误响应,并将其发送回spring控制器/web服务层。 我可以创建一个IBizResponse并创建它的两个子类/接口,可能是SuccessResponse和ErrorResponse,并使域层方法返回IBizResponse。但是,我不知道如何使AOP将ErrorResponse对象返回到服务层。

  • 问题内容: 我正在尝试使用SWIG将C 类包装到Java类中。此类C 类具有引发异常的方法。 我有三个目标,尽管据我所知遵循了手册,但目前没有一个目标: 要使Java类在C ++中引发的方法上声明 要获取SWIG生成的Exception类以进行扩展 在生成的SWIG类中重写。 似乎问题的根源似乎没有应用我的,因为以上均未发生。我做错了什么? 最小的示例如下。C ++不必编译,我只对生成的Java感

  • 问题内容: 假设我有一个抛出某种Exception的方法。引发异常的代码位于访问外部服务的第三方库中。我有一些课程可以很好地处理外部服务,并且有很多异常处理程序可以处理潜在的问题。我遇到的问题是我可能有很多异常,但是如果有一个动作,并且可能有大量尝试/捕获块,我可能只需要执行几个动作之一。异常的类型甚至可能不相关,或者不同的方法可能会抛出相同类型的异常,但是根据抛出该异常的方法,需要采取不同的操作

  • 我拥有的现有代码: 我想丰富现有代码,并在收到一些不允许的数据时引发异常,我做了以下更改: 但由于以下原因,我的实现甚至不可编译: 您能为我的特定场景提供建议吗?

  • 问题内容: 我正在使用AspectJ来拦截java.net.Socket调用。 我创建了一个非常简单的方面 和aop.xml 当调用堆栈是这样的时,我可以看到控制台输出: 但是,当调用栈是这样时,什么都不会注销: 我想知道是否是因为某些安全管理器限制而导致软件包没有在加载时编织。 有谁知道如何使其与软件包一起使用? 更新1 我确认可以拦截该呼叫,但不能拦截该呼叫()。 是否有可能使用AspectJ

  • 我是一个有Spring和Spring靴的新手。在创建了一个简单的REST API来对用户执行CRUD操作之后,我还创建了自定义的异常处理程序来捕获应用程序中发生的任何异常。这是我写的代码 controller类 使用@ControllerAdvice注释的异常处理程序类 但是,当发生任何异常时,应用程序将被重定向到/error page,而不是由异常处理程序类处理。谁能给出正确的方法来做这件事。