У меня есть приложение 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;
}
}
Это невозможно сделать. Тип ответа контроллера не является String. Я не могу вернуть из него пустую строку.




Чтобы выполнить ResponseBodyAdvice в случае ответа NULL, вам необходимо выполнить возврат от вашего контроллера, как показано ниже.
new ResponseEntity<>(null, HttpStatus.OK);
Затем после выполнения ResponseBodyAdvice вы можете реструктурировать свой ответ.
По сути, ваш контроллер не должен просто возвращать NULL, но ResponseEntity с данными NULL будет вызывать требуемое поведение для вашего случая.
Любая причина, по которой responseBodyAdvice не работает с нулем?
@Adi, можешь ли ты поделиться своим кодом, который наконец возвращает NULL? Как вы готовите свой ответ BodyAdvice?
Просто настройте, вы можете попробовать с пустой строкой с конца контроллера и установить null (если вам действительно нужен null). Сообщите мне, правильно ли вызывается
beforeBodyWrite.