Spring MVC: ResponseBodyAdvice не вызывается для нулевого ответа от контроллера

У меня есть приложение 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;
}

}

Просто настройте, вы можете попробовать с пустой строкой с конца контроллера и установить null (если вам действительно нужен null). Сообщите мне, правильно ли вызывается beforeBodyWrite.

Ataur Rahman Munna 06.01.2019 07:25

Это невозможно сделать. Тип ответа контроллера не является String. Я не могу вернуть из него пустую строку.

Adi 06.01.2019 09:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
1 524
1

Ответы 1

Чтобы выполнить ResponseBodyAdvice в случае ответа NULL, вам необходимо выполнить возврат от вашего контроллера, как показано ниже.

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

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

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

Любая причина, по которой responseBodyAdvice не работает с нулем?

Adi 06.01.2019 19:29

@Adi, можешь ли ты поделиться своим кодом, который наконец возвращает NULL? Как вы готовите свой ответ BodyAdvice?

ScanQR 07.01.2019 07:41

Другие вопросы по теме