java - Spring Boot Rest 中没有内容

标签 java rest spring-boot http-status-code-204

当方法不获取记录时,如何配置 Spring Boot 以在 GET 方法(通常是 findAll 方法)中返回 204?我不想在每种方法中都做处理,键入下面的代码:

if(!result)
    return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
    return new ResponseEntity<Void>(HttpStatus.OK)

我想改变这个方法:
@GetMapping
public ResponseEntity<?> findAll(){
    List<User> result = service.findAll();
    return !result.isEmpty() ? 
            new ResponseEntity<>(result, HttpStatus.OK) : new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
}

在这个:
@GetMapping
public List<User> findAll(){
    return service.findAll();
}

如果来自 的结果findAll() 为空或 null 那么我的 Controller 应该返回 204 而不是 200 .

最佳答案

您可以注册一个自定义 ResponseBodyAdvice 它允许自定义 @ResponseBody 的响应或 ResponseEntity处理程序方法(就在内容被 MessageConverter 序列化之前):

@ControllerAdvice
class NoContentControllerAdvice implements ResponseBodyAdvice<List<?>> {

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return List.class.isAssignableFrom(returnType.getParameterType());
    }

    @Override
    public List<?> beforeBodyWrite(List<?> body, MethodParameter returnType, MediaType selectedContentType,
               Class<? extends HttpMessageConverter<?>> selectedConverterType,
               ServerHttpRequest request, ServerHttpResponse response) {

        if (body.isEmpty()) {
            response.setStatusCode(HttpStatus.NO_CONTENT);
        }
        return body;
    }
}

关于java - Spring Boot Rest 中没有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49818918/

相关文章:

java - 我应该怎么做才能从集群缓存对等方引导缓存?

c# - C# 中的 GetResponse()

rest - 将自定义属性添加到序列化对象

spring-boot - 如何在不获取 "No suitable writer found exception"的情况下将异步数据写入远程端点?

java - 从 JButton actionListener 更新 JLabel

java - 读取写入 Firebase 实时数据库

javascript - Dynamics Crm 从外部源调用工作流程

java - 如何定义子文件夹来查找 jhipster 注册表的配置文件

spring - 在 docker-compose 中的 spring boot 应用程序中使用外部配置

java - 找不到 EnableOAuth2Sso 注释的导入