spring-mvc с проблемой кодирования символов на сервере причала

Я пытаюсь реализовать протокол покоя на сервере причала. У меня есть работающий сервер, и я могу получить к нему доступ с моего остального клиента. Мой проект на стороне сервера - это проект 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;
}

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


person erimerturk    schedule 26.04.2011    source источник


Ответы (1)


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

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

1) заставить кодировку возвращать byte[]

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-beta-1 или более новой версии.

person ascandroli    schedule 27.04.2011
comment
Первый вариант для меня неприемлем, потому что я могу сказать, что мой клиент - пустышка. Что касается второго варианта, я не могу его использовать еще и потому, что мне нужно самому преобразовать объект object2json человека. Так что для меня это до сих пор нерешенная проблема. Спасибо за ваши варианты. - person erimerturk; 27.04.2011
comment
Что вы имеете в виду, когда говорите, что мой клиент - пустышка? - person ascandroli; 28.04.2011
comment
Я добавил еще два варианта. Я не думаю, что есть какой-либо другой вариант. - person ascandroli; 28.04.2011
comment
спасибо за Ваш ответ. Первые три варианта мне не подходят. Потому что мой тип результата должен быть строковым. Мне не удалось запустить сервер с 2.2-beta-1, я думаю, что jetty 6.1.24 и resteasy 2.2-beta-1 несовместимы. я работаю над этой проблемой. если мне удастся запустить сервер, я увижу результат 4-го варианта. - person erimerturk; 04.05.2011
comment
если ваша проблема в этом исключении Caused by: java.lang.ClassCastException: com.sun.xml.stream.ZephyrParserFactory cannot be cast to org.codehaus.stax2.XMLInputFactory2. Добавьте это в свойства вашей системы: javax.xml.stream.XMLInputFactory=com.ctc.wstx.stax.WstxInputFactory. См.: tynamo.org/ - person ascandroli; 07.05.2011