#spring-mvc #character-encoding #jetty #maven-3 #resteasy
#spring-mvc #кодировка символов #jetty #maven-3 #resteasy
Вопрос:
Я пытаюсь реализовать протокол restful на сервере jetty. У меня есть работающий сервер, и я могу получить к нему доступ из моего rest-клиента. Мой проект на стороне сервера — это проект maven. У меня проблема с кодировкой символов.Когда я проверяю ответ, прежде чем отправить его с контроллера, проблемы с кодировкой нет. Но после того, как я возвращаю ответ клиенту, я вижу поврежденные данные. Заголовок ответа — UTF-8. Также у меня есть прослушиватель для этой проблемы, и я настраиваю запрос и ответ на UTF-8. Я предполагаю, что проблема возникает, когда я пытаюсь записать данные моего ответа в response.
@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 resu<
}
Существует ли какая-либо конфигурация jetty или resteasy для нее? Или есть какой-либо способ решить эту проблему? Спасибо за вашу помощь.
Ответ №1:
Какую версию resteasy вы используете? Существует известная проблема (RESTEASY-467) со строками в 2.0.1 и ранее.
Это ваши варианты:
1) принудительно верните байт кодировки[]
public byte[] getPersons
и затем
return result.getBytes("UTF8");
2) верните список (или создайте список пользователей, если вам это нужно)
public List<Person> getPersons
и пусть resteasy обработает преобразование json.
3) возвращает потоковый вывод
ПРИМЕЧАНИЕ: при использовании этой опции заголовок «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 или более новой версии.
Комментарии:
1. Первый вариант для меня неприемлем, потому что я могу сказать, что мой клиент фиктивный. Что касается второго варианта, я не могу его использовать также потому, что мне нужно самому преобразовать person object2json. Так что для меня это все еще нерешенная проблема. Спасибо за ваши варианты.
2. Что вы подразумеваете под «мой клиент фиктивный»?
3. Я добавил еще два варианта. Я не думаю, что остался какой-либо другой вариант.
4. спасибо за ваш ответ. Первые три варианта для меня бесполезны. Потому что мой тип результата должен быть строковым. мне не удалось запустить мой сервер с 2.2-beta-1, я предполагаю, что jetty 6.1.24 и resteasy 2.2-beta-1 несовместимы. я работаю над этой проблемой. если мне удастся запустить сервер, я смогу увидеть результат 4-го варианта.
5. если ваша проблема заключается в этом ожидании
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 / …