Нет содержимого в Spring Boot Rest

Как настроить Spring Boot для возврата 204 в методах GET (обычно это методы findAll), когда метод не извлекает записи? Я не хотел бы проводить лечение в каждом методе, введите код ниже:

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() пуст или равен нулю, то мой контроллер должен вернуть 204 вместо 200.

1 ответ

Вы можете зарегистрировать кастом 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;
    }
}
Другие вопросы по тегам