JBoss 5エンコードを以前のJBoss 4.1のように振る舞うように設定するにはどうすればよいですか?
-
29-09-2019 - |
質問
Seam 2.2を使用して構築されたアプリケーションであり、JBoss 4.1.2の下で完全に実行されています。私のISPからのサポートのため、JBOSSをバージョン5.1にアップグレードする必要があります。私はJBoss 5の下で同じアプリを実行しようとしましたが、すべてがうまく見えましたが、1つのことが失敗しました。
それはいくつかのJSONを生成して、使用して構築されたチャートをフィードするコードです フラッシュチャートライブラリを開きます. 。私も使用します JOFCライブラリ これらのチャートのJSONを生成します。まあ私たちが使用したアプローチには、基本的にJSONを印刷する縫い目工場があり、この工場を空白の.xhtmlページで参照して、チャートが必要なJSONを適切にレンダリングするためにロードする場所です。いくつかのスニペットに従ってください:
Seam Factoryが呼び出される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が印刷されているラインでは、json文字列は完全に保存されていますが、jboss5を使用すると、「(二重引用符)のcharが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}
私はすでにOSロケールをチェックしており、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
解決
JSFドキュメントを見てレビューし、F:Verbatimタグを見つけました。問題を修正しました。 JSON文字列が印刷されている私の.xhtmlページは次のようなものです。
<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
他のヒント
これが役立つかどうかはわかりませんが、試してみます。
components.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を正しく逃れる。
String output=new String(input.getBytes(),"UTF-8");
このように与えることで問題が解決しました。