Spring Boot / MVC. Чтение заголовка HTTP в MessageConverter, который ранее был установлен в Controller - PullRequest
1 голос
/ 08 марта 2019

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? Это может быть ошибка?

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