从控制器@ExceptionHandler方法调用global@ControllerAdise方法

b4qexyjb  于 2022-10-04  发布在  Spring
关注(0)|答案(1)|浏览(170)

是否可以使用@ExceptionHandler处理控制器中的异常,然后重新抛出该异常,以便@ControllerAdance可以处理它?

我正在尝试这样做,但当我重新抛出异常时,它无法到达ControllerAdvice.

@RestController
public class MyController {

  @GetMapping
  public Something getSomething() {
   ...
  }

  @ExceptionHandler(Exception.class)
  public void handleException(Exception e) throws Exception {
    System.out.println("Log!");
    throw e;
  }
@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(Exception.class)
  public ResponseEntity<...> handleException(Exception exception) {
   // Not working
   ...
  }

一些更多的背景(希望您能给我一些关于实现这一点的不同想法):

现在,我们的应用程序有一个处理异常的GlobalExceptionHandler(用RestControllerAdacy注解)。

现在,我们有了一个新的业务需求,即我们拥有的两个特定的端点现在必须记录一些额外的信息,如“Endpoint Get/Something Get This Error”。

必须记录任何类型的异常,我需要记录它发生的特定端点,并且我需要保持全局处理程序的位置,因为它负责创建错误响应。

解决这一问题的一种方法是更改全局处理程序上的每个方法以注入当前请求,从它检索URL,如果我需要记录该端点并记录它,请检查特定的配置,但将此行为添加到所有处理程序方法感觉是错误的。

3htmauhk

3htmauhk1#

您是否可以使用AOP的方面并使用捕获任何异常来 Package 您的请求?

@Aspect
@Component
public class RequestWrapperAspect {

 @Around("(@annotation(org.springframework.web.bind.annotation.RequestMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.PostMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.PutMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.DeleteMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.GetMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.PatchMapping)) && execution(public * *(..))")
    public Object wrapRequest(final ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        try {
            return proceedingJoinPoint.proceed();
        } catch (Exception e) {
            //whatever you need to do
            throw e;
        }
}

相关问题