Этот вопрос, кажется, задавался снова и снова, и к этому времени я почти уверен, что прочитал все ответы, и все же я не могу заставить это работать.
У меня есть приложение 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, поскольку я не хочу вызывать проблемы в других местах приложения. Я также не думаю, что мне нужно вносить какие-либо изменения, потому что, если я смотрю на мой объект на странице стандартных сведений о приложении, значение отображается правильно.
Я чувствую, что проверил все, но, очевидно, это не так, поскольку это должно быть проблемой с решением. Чего мне не хватает?
С уважением
Даниэль Седлинг