【问题标题】:No Content in Spring Boot RestSpring Boot Rest 中没有内容
【发布时间】:2018-04-13 14:07:07
【问题描述】:

当方法不获取记录时,如何配置 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,那么我的控制器应该返回 204 而不是 200

【问题讨论】:

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


    【解决方案1】:

    您可以注册一个自定义ResponseBodyAdvice,它允许自定义@ResponseBodyResponseEntity 处理程序方法的响应(就在内容被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;
        }
    }
    

    【讨论】:

    • 但这并不关注响应的当前值。当将带有空主体的 200 OK 修改为 204 时,这是一个很好的解决方案,但是对于 500 或 400 也可以这样做吗?异常处理程序会绕过这个吗?
    • @Dennis 很好地测试了实际的响应主体(java.util.List)。如果在处理程序方法中发生异常(在返回响应之前) - 不会触发此建议。
    • 所以我想策略是在非 200 情况下触发异常,然后让这个处理程序假设它所做的只是在某些情况下切换 200 -> 204。谢谢!
    • @fateddy 将返回 [] Incase of Array/List return type ?
    猜你喜欢
    • 2017-10-11
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2018-02-10
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多