كيف أقوم بتعيين JBOSS 5 الترميز للتصرف مثل JBOSS 4.1 السابق؟

StackOverflow https://stackoverflow.com/questions/4103708

سؤال

إنه تطبيق تم إنشاؤه باستخدام Seam 2.2 ويعمل بشكل مثالي تحت JBOSS 4.1.2. بسبب الدعم من ISP الخاص بي ، سيتعين علي ترقية JBoss إلى الإصدار 5.1. حاولت تشغيل التطبيق نفسه تحت JBOSS 5 وبدا كل شيء على ما يرام ولكن فشل شيء واحد.

إنها قطعة من الكود التي تولد بعض JSON لتغذية مخطط تم إنشاؤه باستخدامه فتح مكتبات مخططات الفلاش. أنا كذلك أستعمل مكتبات 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 لتسجيل الدخول. يتم الحفاظ على سلسلة 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 Encode للاقتباسات المزدوجة:

{&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}

لقد قمت بالفعل بفحص لغة 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 لجميع الموارد والصفحات في تطبيقنا.

أي أدلة؟

تكساس مقدما. []س

هل كانت مفيدة؟

المحلول

لقد ألقيت نظرة على وثائق JSF لمراجعتها ووجدت F: Verbatim Tag. أصلح القضية. الآن صفحة .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 وتتغير الرسم بشكل صحيح.

نصائح أخرى

لا أعرف ما إذا كان هذا سيساعد ، لكنني سأحاول.

في المكونات

<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;","\\\"");

لست متأكدًا من أن Regex ستعمل بشكل صحيح ، ولكن يمكنك المحاولة. يمكنك أيضًا الاستخدام StringesCapeutils من Apache Commons للهروب بشكل صحيح جميع HTML.

String output=new String(input.getBytes(),"UTF-8");

إعطاء مثل هذا حل المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top