【发布时间】:2016-11-22 11:46:01
【问题描述】:
我不知道为什么,但 @ControllerAdvice 使用 @ResponseStatus 注释覆盖在 Exception 级别定义的响应代码。
例外:
@ResponseStatus(HttpStatus.BAD_REQUEST)
公共类 GreetException 扩展 RuntimeException {}
控制器:
@RestController
@RequestMapping("/")
public class GreetController {
@RequestMapping(method = RequestMethod.GET)
public String greet() {
throw new GreetException();
}
}
控制器建议:
@ControllerAdvice
public class ExceptionConfiguration {
@ResponseStatus(HttpStatus.CONFLICT)
@ExceptionHandler(RuntimeException.class)
public void handleConflict() {}
}
当来自GreetController 的 greet 方法被调用时,响应为 409 - CONFLICT。因为我专门提供了异常级别的响应代码,所以我希望这将是返回的代码 (400 - BAD_REQUEST)。
当然,这是一个过于简化的示例,但我们使用 RuntimeException 定义定义了一个控制器通知,因此我们可以为每个未捕获的异常分配一个 id。
实现预期行为的正确方法是什么?
【问题讨论】:
-
在你的 controllerAdvice 类中,你应该使用 GreetException 类作为 ExceptionHandler 而不是 RuntimeException 类。 @ExceptionHandler(GreetException.class) public void handleConflict() {}。抛出异常时要执行的最后一个类将是您的 controllerAdvice。
-
@duardito RuntimeException 的异常处理程序是捕获所有未捕获的内容。因为我声明了 GreetException 的响应状态,所以我不希望使用 RuntimeE 处理程序。
标签: spring spring-mvc spring-boot spring-annotations