Spring Boot中@RestControllerAdvice覆盖@ResponseStatus的用法咨询
@ResponseStatus在Spring Boot中的正确用法解析
为什么自定义异常类的@ResponseStatus会被覆盖
当你通过@RestControllerAdvice中的@ExceptionHandler(注:你代码里的@ExceptionalHandler是拼写错误,正确为@ExceptionHandler)处理自定义异常时,Spring的优先级规则是:全局/控制器级的异常处理方法配置会覆盖异常类本身的@ResponseStatus注解。所以你看到状态码变为200,是因为未给处理方法加@ResponseStatus时,Spring默认返回200(因方法返回了自定义响应体),而异常类上的注解被直接忽略。
不同场景下的用法选择
1. 放在自定义异常类上
- 适用场景:不需要自定义响应体,仅需指定异常对应HTTP状态码和简单错误提示的场景。
- 用法示例:
@ResponseStatus(HttpStatus.BAD_REQUEST) public class MyCustomException extends RuntimeException { public MyCustomException(String message) { super(message); } }
- 优势:极度简洁,抛出该异常时,Spring会自动识别注解,返回指定状态码和异常消息,无需额外编写处理方法。
- 注意:如果存在对应的
@ExceptionHandler方法处理该异常,此注解会被完全忽略。
2. 放在@ExceptionHandler方法上
- 适用场景:需要返回结构化自定义响应体(比如你的
MyCustomErrorClass)、或需根据异常具体属性动态调整响应内容/状态码的场景。 - 用法示例:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MyCustomException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public MyCustomErrorClass handleMyCustomException(MyCustomException e) { return buildMyCustomErrorClass(e); } }
- 优势:灵活性拉满,能完全控制响应的所有内容,包括状态码、响应体结构,不受异常类注解的限制。
3. 两者都放
这种配置几乎无实际意义:只要有对应的@ExceptionHandler方法,异常类上的@ResponseStatus就会被忽略;若没有处理方法,异常类的注解才会生效。属于冗余配置,不推荐。
总结建议
- 若仅需固定状态码+简单提示,优先把
@ResponseStatus放在自定义异常类上,无需额外处理方法,符合你想要的简洁性。 - 若需要自定义响应体或复杂逻辑,就把
@ResponseStatus放在@ExceptionHandler方法上,同时可移除异常类上的注解避免冗余。
内容的提问来源于stack exchange,提问作者sagar
相关产品推荐
相关产品推荐

