从controller@ExceptionHandler方法调用global@ControllerAdvice方法



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

我正在尝试这样做,但当我重新抛出异常时,它没有到达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(用RestControllerAdvice注释(。

现在,我们有一个新的业务需求,即我们拥有的2个特定端点现在必须记录一些额外的信息,如";端点GET/something得到了这个错误";。

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

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

你能使用AOP的方面并用catch-anny异常包装你的请求吗?

@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;
}
}

相关内容

最新更新