Java Spring Boot控制器如何按业务条件返回205等不同HTTP响应码
Spring Boot接口条件自定义响应状态码解决方案
以下是两种可直接落地的实现方式:
方案1:使用ResponseEntity封装返回值(推荐)
这是Spring官方推荐的动态设置状态码方案,逻辑清晰无额外依赖,仅需调整方法返回类型即可:
@RequestMapping(value = "/profiles/me", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<UserDto> updateProfile(@RequestBody @Validated(ProfileValidation.class) UserDto userDto) throws Exception { // 原有业务逻辑不变 user = userService.updateProfile(userDto); token = authenticatedService.getToken(); if("NOT_ACTIVATED".equals(user.getAccountStatus())){ token = authenticationService .generateNewSession(new UserAuth.Builder().userId(user.getAcquirerId()) .accountStatus(user.getAccountStatus()).role(user.getRole()).build()); // 条件满足时返回205状态码+响应体 return new ResponseEntity<>(DtoAssembler.assemble(user, token), HttpStatus.RESET_CONTENT); } // 默认返回200状态码+响应体 return ResponseEntity.ok(DtoAssembler.assemble(user, token)); }
其中HttpStatus.RESET_CONTENT是Spring封装的205状态码枚举,无需手动写硬编码数字。
方案2:注入HttpServletResponse直接设置状态码
如果不想修改原有方法的返回类型,可以直接注入HttpServletResponse对象手动修改状态码:
@RequestMapping(value = "/profiles/me", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public UserDto updateProfile(@RequestBody @Validated(ProfileValidation.class) UserDto userDto, HttpServletResponse response) throws Exception { user = userService.updateProfile(userDto); token = authenticatedService.getToken(); if("NOT_ACTIVATED".equals(user.getAccountStatus())){ token = authenticationService .generateNewSession(new UserAuth.Builder().userId(user.getAcquirerId()) .accountStatus(user.getAccountStatus()).role(user.getRole()).build()); // 直接设置响应状态码为205 response.setStatus(HttpServletResponse.SC_RESET_CONTENT); } return DtoAssembler.assemble(user, token); }
注意:原代码中字符串比较使用==是错误用法,需替换为equals方法,否则可能出现字符串值相等但判断不通过的问题;205状态码语义为「重置内容」,请确保和业务场景匹配,避免语义混用导致前端处理异常
内容的提问来源于stack exchange,提问作者ab AL
相关产品推荐
相关产品推荐

