3

当方法不获取记录时,如何将 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

4

1 回答 1

5

您可以注册一个自定义ResponseBodyAdvice,它允许自定义@ResponseBodyResponseEntity处理程序方法的响应(就在内容被 a 序列化之前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;
    }
}
于 2018-04-13T23:21:41.523 回答