Spring Controller PUT接口如何移除201状态码并保留200、401、404等状态码
Spring PUT接口固定返回200状态码的解决方案
首先排查@ResponseStatus不生效的常见原因
- 确认你导入的
HttpStatus是org.springframework.http.HttpStatus包下的类,避免导错包导致注解不生效 - 检查项目中是否存在全局
@ControllerAdvice、ResponseBodyAdvice实现类,或者自定义拦截器,这类全局组件可能会强制改写PUT请求的响应状态码为默认201 - 如果项目集成了Spring Data REST类的REST自动配置组件,这类组件默认会对PUT/POST请求的响应状态做统一处理,注解优先级低于全局配置
最优解决方法:使用ResponseEntity显式指定状态码
这种方式优先级最高,不会被全局配置覆盖,完全可控,调整后的代码示例如下:
@PutMapping("/entry/user") public ResponseEntity<UpdatingVO> userEntry(@RequestBody UpdateDtsVO updateDtsVO) { // 补充你遗漏的方法入参定义 UpdatingVO update = new UpdatingVO(); try{ update = service.allowUser(updateDtsVO); } catch(Exception e){ update.setErrorMessage(e.getMessage()); update.setStatus(UserConstant.FAILURE); } return ResponseEntity.ok(update); // 显式指定返回200状态码 }
采用这种方式的同时,401、404这类由Spring安全框架、Web MVC原生抛出的异常状态码不会被覆盖,完全符合你的需求。
其他可选调整方案
如果坚持使用@ResponseStatus注解,可以先关闭对应PUT请求的全局状态码覆盖配置,以Spring Data REST为例,在配置类中添加以下配置:
@Configuration public class RestConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) { config.setReturnBodyForPutAndPatch(true); // 禁用PUT请求默认返回201的配置 config.getItemResourceDescription().getPutItemDescription().setStatusCode(HttpStatus.OK); } }
注意:这种方式需要适配你当前项目使用的REST框架配置,通用性不如ResponseEntity方案。
内容的提问来源于stack exchange,提问作者SDJ
相关产品推荐
相关产品推荐

