You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:26