Spring MVC: ResponseBodyAdvice не вызывается для нулевого ответа от контроллера - PullRequest
0 голосов
/ 05 января 2019

У меня есть приложение Spring boot REST API. У меня есть сценарий использования для добавления некоторых общих параметров ко всем ответам API, таких как time и clientId. Чтобы добиться этого, я использую ResponseBodyAdvice для управления выходом контроллеров. Однако, если контроллер возвращает null, ResponseBodyAdvice не вызывается. Я подтвердил это, добавив журналы и точки останова.

Мой вопрос: как мне преодолеть это поведение? В основном для случаев, когда контроллер возвращает null, например, когда данных не существует, я все еще хочу, чтобы мой вывод API содержал общие поля.

Это мой ожидаемый вывод для API GET /users/{userId}, когда для данного идентификатора нет пользователя.

{
   "time": "2018-11-10 23:00:00",
   "clientId": "MyClient",
   "data": null
}

Однако, поскольку мой ResponseBodyAdvice не выполняется, я не получаю вывод только 200 с другими заголовками.

Вот код моего ResponseBodyAdvice

@ControllerAdvice("com.tl.core.controller")
public class TLResponseAdvice implements ResponseBodyAdvice<Object> {

@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    System.out.println("::RBA:: supports");
    return true;
}

@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
        Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
        ServerHttpResponse response) {
    System.out.println("::RBA:: beforebodywrite1 " + body);
    if(returnType.getMethod().getName().equalsIgnoreCase("handleControllerException")) {
        return body;
    }
    System.out.println("::RBA:: beforebodywrite2");
    final RestResponse<Object> output = new RestResponse<>(HttpStatus.OK.value());
    output.setData(body);
    // set common fields here.
    ...
    return output;
}

@ExceptionHandler(Exception.class)
@ResponseBody
public TLResponseEntity<Object> handleControllerException(HttpServletRequest request, Throwable ex) {
    final RestResponse<Object> output = new RestResponse<>(HttpStatus.INTERNAL_SERVER_ERROR.value());
    // set common fields here
    ...
    final TLResponseEntity<Object> finaloutput = new TLResponseEntity<>(output);
    return finaloutput;
}

} * * тысяча двадцать-один

1 Ответ

0 голосов
/ 06 января 2019

Вам необходимо вернуться с контроллера следующим образом, чтобы выполнить ResponseBodyAdvice в случае NULL-ответа.

new ResponseEntity<>(null, HttpStatus.OK);

Затем, как только ваш ResponseBodyAdvice будет выполнен, вы можете реструктурировать свой ответ.

По сути, ваш контроллер должен не только возвращать NULL, но ResponseEntity с данными NULL будет вызывать требуемое поведение для вашего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...