Как настроить кодировку JBoss 5 так, чтобы она работала как прежняя версия JBoss 4.1?
Это приложение, созданное с использованием seam 2.2, и оно отлично работает под Jboss 4.1.2. Из-за поддержки моего интернет-провайдера мне придется обновить JBoss до версии 5.1 . Я попытался запустить одно и то же приложение под JBoss 5, и все выглядело нормально, но одна вещь не удалась.
Это кусок кода, который генерирует некоторый JSon для подачи диаграммы, созданной с использованием библиотек Open Flash Chart. Я также использую библиотеки JOFC для генерации JSon для этих диаграмм. Хорошо, подход, который мы использовали, в основном имеет фабрику швов, которая печатает JSon, а затем мы ссылаемся на эту фабрику на пустой странице.xhtml, откуда диаграмма загружает требуемый JSon для правильной визуализации. Следуйте за некоторыми фрагментами:
Страница xhtml, где вызывается фабрика швов:
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
contentType="text/json; charset=UTF-8">
#{jsonGraficoPesoUsuario}
</f:view>
Заводской метод, который генерирует строку JSon:
@Factory("jsonGraficoPesoUsuario")
public String graficoPesoUsuario()
{
...
String jsonString = chart.toString();
log.info("JSonString ==>> " + jsonString);
// try {
// jsonString = URLEncoder.encode(jsonString, "UTF-8");
// } catch (UnsupportedEncodingException e) {
// log.error("Erro ao tentar fazer o encode da string json ==>> " + e.getMessage());
// e.printStackTrace();
// }
return jsonString;
Хорошо, код показывает также, что мы попытались зашифровать строку json перед отправкой, но опять-таки безуспешно. В строке, где печатается json для log.info, строка json прекрасно сохраняется, но с использованием JBoss5 происходит то, что символы " (двойные кавычки) заменяются на escape-символы html.
Ожидается, что следующая строка json правильно подаст диаграмму, и это правильно работает в jboss4:
{"y_axis":{"min":100,"colour":"#96A9C5","grid-colour":"#DDDEE1","max":112},"title":{"text"
:"Gráfico de evolução de Peso"},"bg_colour":"#FFFFFF","is_decimal_separator_comma":1,"elements":[{"text":"Peso","values":[100.5,101.5,102.5,
102,103,107,109,110.5,108],"font-size":10,"type":"line","tip":"Linha do Peso"}],"num_decimals":2,"is_fixed_num_decimals_forced":1,"x_axis":{
"colour":"#96A9C5","grid-colour":"#DDDEE1","labels":{"rotate":"-24","labels":["01/05/10","15/05/10","25/05/10","01/06/10","09/06/10","25/06/
10","05/07/10","10/07/10","20/07/10"]}},"is_thousand_separator_disabled":0}
Но чем при использовании JBoss5 выводится следующая строка, обратите внимание на замену HTML-кодирования для двойных кавычек:
{"y_axis":{"min":100,"colour":"#96A9C5","grid-colour":"#DDDEE1","max":112},"title":{"text":"Gráfico de evolução de Peso"},"bg_colour":"#FFFFFF","is_decimal_separator_comma":1,"elements":[{"text":"Peso","values":[100.5,101.5,102.5,102,103,107,109,110.5,108],"font-size":10,"type":"line","tip":"Linha do Peso"}],"num_decimals":2,"is_fixed_num_decimals_forced":1,"x_axis":{"colour":"#96A9C5","grid-colour":"#DDDEE1","labels":{"rotate":"-24","labels":["01/05/10","15/05/10","25/05/10","01/06/10","09/06/10","25/06/10","05/07/10","10/07/10","20/07/10"]}},"is_thousand_separator_disabled":0}
Я уже проверил локаль ОС, а также выполнил настройку на канале jboss http для кодирования тела в server.xml:
<!-- A HTTP/1.1 Connector on port 8080 -->
<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}"
connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/>
Это не сработало. Мы используем UTF-8 для всех ресурсов и страниц в нашем приложении.
Есть какие-нибудь подсказки?
Tx заранее. [] S
3 ответа
Я просмотрел документацию jsf, чтобы просмотреть ее, и нашел тег f:verbatim. Это исправило проблему. Теперь моя страница.xhtml, на которой напечатана строка json, выглядит так:
<f:view xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
contentType="text/json" >
<f:verbatim>
#{jsonGraficoPesoUsuario}
</f:verbatim>
</f:view>
Теперь результирующая строка json не изменяется и графика отображается правильно.
[] S
String output=new String(input.getBytes(),"UTF-8");
Предоставление как это решило проблему.
Не знаю, поможет ли это, но я постараюсь.
В компонентах.xml указан
<web:character-encoding-filter encoding="UTF-8" override-client="true" url-pattern="*.seam" />
Создайте фильтр, который установит все в UTF-8
public class UTF8Filter implements Filter {
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// set encoding to UTF-8
req.setCharacterEncoding("UTF-8");
chain.doFilter(req, res);
return;
}
public void init(FilterConfig arg0) throws ServletException {}
}
И включите этот фильтр в web.xml
<filter>
<filter-name>UTF8 Filter</filter-name>
<filter-class>my.package.filter.UTF8Filter</filter-class>
</filter>
Если это не поможет, вы можете вручную закодировать строку
//If you only have problem with " you can do this
jsonString.replaceAll(""","\\\"");
Я не уверен, что регулярное выражение будет работать правильно, но вы можете попробовать. Возможно, вы также можете использовать StringEscapeUtils из Apache Commons для корректного экранирования всего HTML.