Ответ HTTP от Spring Controller не кодируется в UTF - PullRequest
0 голосов
/ 10 февраля 2020

Этот вопрос, кажется, задавался снова и снова, и к этому времени я почти уверен, что прочитал все ответы, и все же я не могу заставить это работать.

У меня есть приложение AngularJS, которое отправляет запрос ajax на URL-адрес, указывающий на класс Spring @Controller на том же сервере Tomcat. Из моего файла журнала на сервере я вижу, что мое тестовое значение - € μ ™ Σσ-åäö - получено правильно, и также кажется, что строка json создана с правильным значением.

Мой контроллер устанавливает заголовок Content-Type, а также кодировку, используемую для ответа.

@ModelAttribute
public void setResponseHeader(HttpServletResponse response) {
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Content-Type", "application/json");
    response.setCharacterEncoding(UTF8);
}

Он также печатает json непосредственно в объекте ответа. Я также пытался вернуть ResponseEntity, но он только что дал мне то же неверное значение.

private void writeJsonToResponse (Содержимое объекта, статус HttpStatus, ответ HttpServletResponse) {

try {

    ByteArrayOutputStream out = new ByteArrayInputOutputStream();
    try (PrintStream prs = new PrintStream(out, true, UTF8)) {
        builder.create().toJson(content, prs);
    }

    String ouput = out.toString(UTF8);
    logger.debug("output: " + ouput);

    response.getOutputStream().write(ouput.getBytes(UTF8));
    response.getOutputStream().close();
    response.setStatus(status.value());

} catch (Exception ex) {
    logger.error("Unhandled API error", ex);
    throw new RuntimeException(API_ERROR_MSG, ex);
}

}

Вызываемый метод выглядит следующим образом

 @RequestMapping(value = "/lookup", method = {RequestMethod.POST, RequestMethod.GET}, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public void lookup(HttpServletRequest request, HttpServletResponse response) {
        handle(new TaskHandler("genericLookup.xml", "OUT"), request, response);
    }

Когда я смотрю на запрос в Chrome Dev Tools, я вижу, что заголовок действительно установлен правильно, но возвращается json содержит не правильное тестовое значение, а скорее строку (другого) бессмысленного символа, подобного тем, которые я получил бы, если бы рассматривал значение как ANSI.

Мой @Controller работает в другом приложении, поэтому я немного не решается внести множество изменений в конфигурацию Spring, поскольку я не хочу вызывать проблемы в других местах приложения. Я также не думаю, что мне нужно вносить какие-либо изменения, потому что, если я смотрю на мой объект на странице стандартных сведений о приложении, значение отображается правильно.

Я чувствую, что проверил все, но, очевидно, это не так, поскольку это должно быть проблемой с решением. Чего мне не хватает?

С уважением

Даниэль Седлинг

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