mvl*_*pan 5 spring spring-mvc spring-annotations spring-boot
我不确定为什么,但是它@ControllerAdvice会覆盖Exception使用@ResponseStatus注释在级别定义的响应代码.
例外:
@ResponseStatus(HttpStatus.BAD_REQUEST)
public class GreetException extends RuntimeException {}
Run Code Online (Sandbox Code Playgroud)
控制器:
@RestController
@RequestMapping("/")
public class GreetController {
@RequestMapping(method = RequestMethod.GET)
public String greet() {
throw new GreetException();
}
}
Run Code Online (Sandbox Code Playgroud)
控制建议:
@ControllerAdvice
public class ExceptionConfiguration {
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(RuntimeException.class)
public void handleConflict() {}
}
Run Code Online (Sandbox Code Playgroud)
来自GreetController被称为响应的greet方法的响应是409 - CONFLICT.因为我特意提供了异常级别的响应代码,我预计这将是返回的代码(400 - BAD_REQUEST).
当然,这是一个过于简化的示例,但我们定义了一个带有RuntimeException定义的控制器建议,因此我们可以为每个未捕获的异常分配一个id.
实现预期行为的正确方法是什么?
小智 7
注释异常的问题@ResponseStatus是,只有在异常未在其他地方处理时才会触发此问题.
请参阅Spring文章中关于Spring MVC中的异常处理的引用:
当从控制器方法抛出带注释的异常而不在其他地方处理时,它将自动使用指定的状态代码返回相应的HTTP响应.
同一篇文章描述了尽管有ControllerAdvice一个通用处理程序使其工作的方法.请参阅有关ControllerAdvice的段落.
你基本上要做的是在你的通用处理程序中重新抛出异常,如果它用@ResponseStatus以下注释:
@ControllerAdvice
public class ExceptionConfiguration {
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(RuntimeException.class)
public void handleConflict(RuntimeException e) throws RuntimeException {
// Check for annotation
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
// Rethrow Exception
throw e;
}
else {
// Provide your general exception handling here
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3931 次 |
| 最近记录: |