Как настроить кодировку JBoss 5 так, чтобы она работала как прежняя версия JBoss 4.1? - PullRequest
1 голос
/ 05 ноября 2010

Это приложение, которое было построено с использованием шва 2.2 и отлично работает под Jboss 4.1.2. Из-за поддержки моего интернет-провайдера мне придется обновить JBoss до версии 5.1. Я попытался запустить то же приложение под JBoss 5, и все выглядело нормально, но одна вещь не удалась.

Это фрагмент кода, который генерирует некоторый JSon для подачи диаграммы, построенной с использованием Open Flash Chart library . Я также использую библиотеки 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 происходит то, что символы "(двойные кавычки) заменяются на html escape-символы.

Ожидается, что следующая строка 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-кодировку для замены двойных кавычек:

{&quot;y_axis&quot;:{&quot;min&quot;:100,&quot;colour&quot;:&quot;#96A9C5&quot;,&quot;grid-colour&quot;:&quot;#DDDEE1&quot;,&quot;max&quot;:112},&quot;title&quot;:{&quot;text&quot;:&quot;Gr&aacute;fico de evolu&ccedil;&atilde;o de Peso&quot;},&quot;bg_colour&quot;:&quot;#FFFFFF&quot;,&quot;is_decimal_separator_comma&quot;:1,&quot;elements&quot;:[{&quot;text&quot;:&quot;Peso&quot;,&quot;values&quot;:[100.5,101.5,102.5,102,103,107,109,110.5,108],&quot;font-size&quot;:10,&quot;type&quot;:&quot;line&quot;,&quot;tip&quot;:&quot;Linha do Peso&quot;}],&quot;num_decimals&quot;:2,&quot;is_fixed_num_decimals_forced&quot;:1,&quot;x_axis&quot;:{&quot;colour&quot;:&quot;#96A9C5&quot;,&quot;grid-colour&quot;:&quot;#DDDEE1&quot;,&quot;labels&quot;:{&quot;rotate&quot;:&quot;-24&quot;,&quot;labels&quot;:[&quot;01/05/10&quot;,&quot;15/05/10&quot;,&quot;25/05/10&quot;,&quot;01/06/10&quot;,&quot;09/06/10&quot;,&quot;25/06/10&quot;,&quot;05/07/10&quot;,&quot;10/07/10&quot;,&quot;20/07/10&quot;]}},&quot;is_thousand_separator_disabled&quot;:0}

Я уже проверил язык O.S, а также выполнил настройку на канале 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 ]

2 голосов
/ 07 ноября 2010

Я взглянул на документацию 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 не изменяется, и изображение отображается правильно.

1 голос
/ 16 августа 2011
String output=new String(input.getBytes(),"UTF-8");

Дать так решил вопрос.

1 голос
/ 05 ноября 2010

Не знаю, поможет ли это, но я попробую.

В компонентах .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 &quot; you can do this
 jsonString.replaceAll("&quot;","\\\"");

Я не уверен, что регулярное выражение будет работать правильно, но вы можете попробовать. Возможно, вы также можете использовать StringEscapeUtils от Apache Commons для корректного экранирования всего HTML.

...