REST Controller должен настроить преобразование JSON в зависимости от результата бизнес-логики. Само преобразование происходит в MessageConverter. Обычно в MappingJackson2HttpMessageConverter
. Для этого метод контроллера устанавливает дополнительный заголовок ответа, подобный этому.
@GetMapping("/method")
@Override
public ResultObject method(HttpServletResponse response) {
if (weNeedItPretty) {
response.setHeader("X-pretty-print", "1");
}
}
MessageConverter читает заголовок и корректирует его поведение.
@Override
protected void writeInternal(Object o, Type t, HttpOutputMessage output) {
HttpHeaders headers = output.getHeaders();
List<String> header = headers.remove("X-pretty-pring");
if (header != null && ! header.isEmpty()) {
// do it pretty
}
}
Это работало со старой версией Spring 4.0, но больше не работало со Spring Boot 2.0 (Spring 5.1.4). HttpOutputMessage просто не включает заголовки, которые ранее были установлены контроллером с помощью HttpServletResponse.
Можно поискать оригинальный HttpServletResponse внутри HttpOutputMessage, и он работает:
ServletServerHttpResponse oo = (ServletServerHttpResponse)output;
HttpServletResponse response = oo.getServletResponse();
Collection<String> headers = response.getHeaderNames();
Но выглядит безумно. Возможно ли распространять заголовки из HttpServletResponse в HttpOutputMessage автоматически, как это было в Spring 4.0? Это может быть ошибка?