spring-mvc с проблемной кодировкой символов на сервере Jetty - PullRequest
1 голос
/ 26 апреля 2011

Я пытаюсь реализовать протокол restful на сервере Jetty. У меня есть работающий сервер, и я могу получить к нему доступ из моего клиентского компьютера. Мой проект на стороне сервера - проект maven. У меня проблема с кодировкой символов. Когда я проверяю ответ, перед отправкой с контроллера не возникает проблем с кодировкой. Но после того, как я возвращаю ответ клиенту, я вижу неработающие данные. Заголовок ответа - UTF-8. Также у меня есть слушатель для этой проблемы, и я устанавливаю запрос и ответ на UTF-8. Я предполагаю, что проблема возникает, когда я пытаюсь записать свои данные ответа в ответ.

@GET
@Path("/")
@Produces({"application/xml;charset=UTF-8","application/json;charset=UTF-8"})
public String getPersons(@Context HttpServletRequest request, @Context HttpServletResponse response) {

    List<Person> persons = personService.getPersons(testUserId, collectionOption, null);
    if (persons == null) {
        persons = new ArrayList<Person>();
    }

    String result = JsonUtil.listToJson(persons);
    //result doesnt has any encoding problem at this line

    response.setContentType("application/json");
    response.setContentLength(result.length());
    response.setCharacterEncoding("utf-8");

    //i guess problem happen after this line
    return result;
}

Есть ли какая-либо конфигурация причала или конфигурация рестайзи для него? Или есть ли способ решить эту проблему? Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 27 апреля 2011

Какую версию вы используете? Существует известная проблема ( RESTEASY-467 ) со строками в 2.0.1 и ранее.

Это ваши варианты:

1) принудительно возвращает байту кодировки []

public byte[] getPersons

, а затем

return result.getBytes("UTF8");

2) вернуть список (или создать PersonListing, если вам это нужно)

public List<Person> getPersons

и пусть resteasy обрабатывает преобразование json.

3) вернуть StreamingOutput

ПРИМЕЧАНИЕ: с этой опцией заголовок «Content-Length» будет неизвестен.

return new StreamingOutput()
{

    public void write(OutputStream outputStream) throws IOException, WebApplicationException
    {
        PrintStream writer = new PrintStream(outputStream, true, "UTF-8");
        writer.println(result);
    }
};

4) обновление до 2.2-бета-1 или более новой версии.

...