如何配置Spring Boot使GET方法无数据时返回204状态码?
全局处理Spring Boot GET查询空结果返回204状态码
嘿,重复写空集合判断的代码确实挺冗余的!咱们可以用Spring提供的ResponseBodyAdvice来实现全局统一处理,彻底告别每个接口里的重复逻辑。
1. 实现全局响应处理器
创建一个全局控制器增强类,专门处理返回集合的GET请求:
import org.springframework.core.MethodParameter; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.Collection; @ControllerAdvice public class EmptyCollectionResponseHandler implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { // 只拦截返回Collection类型(List、Set等都属于它)且标记了@GetMapping的方法 return Collection.class.isAssignableFrom(returnType.getParameterType()) && returnType.getMethod().isAnnotationPresent(GetMapping.class); } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { Collection<?> resultCollection = (Collection<?>) body; if (resultCollection.isEmpty()) { // 空集合时设置HTTP状态码为204 NO_CONTENT response.setStatusCode(HttpStatus.NO_CONTENT); // 204响应规范要求响应体为空,这里返回null即可(Jackson等转换器会处理为空响应) return null; } // 非空集合则保持原数据和默认200状态码 return body; } }
这个类的作用是:
@ControllerAdvice让它作用于所有控制器supports方法筛选需要处理的接口:只处理返回集合的GET请求beforeBodyWrite在响应体写出前判断集合是否为空,空则设置204状态码并清空响应体
2. 改造现有接口方法
现在你可以把原来的ResponseEntity返回值改成直接返回集合,不用再写任何判断逻辑:
@GetMapping public List<User> findAll() { return service.findAll(); }
额外注意事项
- 如果有个别GET接口返回集合但不想应用这个规则,可以自定义一个注解(比如
@IgnoreEmptyCollection204),然后在supports方法里排除带有这个注解的方法 - 如果你的接口返回的是自定义响应DTO(比如包含
data字段的包装类),可以修改beforeBodyWrite方法,判断DTO中的data是否为空集合再处理 - 204状态码的HTTP规范要求响应体必须为空,所以返回
null是符合规范的,大部分消息转换器(如Jackson)都会正确处理成空响应
内容的提问来源于stack exchange,提问作者Luciano Borges
相关产品推荐
相关产品推荐

