2011-10-04 19 views
20

Esto está en GlassFish 3.1, usando PrimeFaces sobre Mojarra y salado con MyFaces CODI. En casi todas las solicitudes que aparezca el siguiente mensaje:Cómo deshacerse de WARNING: PWC4011: no se puede establecer la codificación de caracteres de solicitud en UTF-8

ADVERTENCIA: PWC4011: No se puede establecer solicitud de codificación de caracteres UTF-8 a partir del contexto /com.myapp_war_0.1, debido a parámetros de la petición ya han sido leídos, o ServletRequest. getReader() ya ha sido llamado

Esto ha ocurrido desde que empecé el proyecto - hasta ahora he estado haciendo caso omiso, pero ahora me he dado cuenta que estoy perdiendo un montón de tiempo leyendo su alrededor. Encontré un trabajo interesante pero incompleto: here, pero no lo entiendo.

¿Alguien puede sugerir cómo amontonar este mensaje sin suprimir otros posibles mensajes de advertencia?

+0

Desde mi experiencia este famoso mensaje se pierde después de actualizar la versión mojarra . Cual estas usando? – Osw

+0

@Osw: de hecho hubo un error relacionado en una de las primeras versiones de Mojarra 2.0.x, pero eso fue causado por un problema levemente diferente y afectó solo las solicitudes de Ajax. Sin embargo, OP está utilizando GF 3.1, que agrupa JSF 2.1. – BalusC

+0

@osw: específicamente estoy usando GF 3.1.1 Build 12. Probablemente no debería, pero dejo que tanto Netbeans como GF descarguen todas las actualizaciones tan pronto como estén disponibles. Sin embargo, recuerdo este problema en casi todos los niveles de versión. Llegué al punto en el que estaba probando muchas páginas, generando suficientes mensajes de error en el proceso, que me estimularon para tomar medidas al respecto. Por cierto, la versión de Mojarra en este paquete es 2.1.3 (FCS b02). – AlanObject

Respuesta

38

JSF/Facelets utiliza por defecto UTF-8 para decodificar los parámetros de solicitud HTTP. GlassFish usa por defecto el ISO-8859-1 para decodificar los parámetros de solicitud HTTP. Los parámetros de solicitud HTTP pueden analizarse y decodificarse solo una vez, y esto ocurre siempre que el código solicite un parámetro de solicitud por primera vez, como request.getParameter("name"). Por lo tanto, si se solicita un parámetro de solicitud por primera vez antes de JSF ha establecido la codificación del parámetro de solicitud en UTF-8, entonces se analizará (incorrectamente) utilizando ISO-8859-1.

Cuando JSF tiene que establecer el parámetro de la petición de codificación durante la fase de restauración de vista de la siguiente manera,

request.setCharacterEncoding("UTF-8"); 

mientras que los parámetros de la petición ya se analizan, a continuación, GlassFish mostrará exactamente esta advertencia.

La consecuencia no deseada es que todos esos parámetros de solicitud HTTP pueden posiblemente terminar en Mojibake. Los datos del formulario se enviaron originalmente y se codificaron utilizando UTF-8. Si decodifica datos UTF-8 usando un juego de caracteres diferente como ISO-8859-1, entonces los caracteres en el rango de 8 bits y más allá (por lo general, son esos "caracteres especiales" como é, à, ö, etc. se corromperán y terminan en é, à, ö, etc.

Técnicamente, la solución correcta es no solicitud de un parámetro de petición HTTP antes JSF ha establecido la codificación correcta. es, básicamente, tiene que comprobar todo el código que se ejecuta antes de la fase de vista de restauración de JSF, como filtros de servlets, oyentes de fase, etc., si no lo están haciendo.

Si parece que no puede encontrarlo, o el código está fuera de su control, puede indicarle a GlassFish que use UTF-8 para decodificar los parámetros de solicitud HTTP, de modo que no necesite cambiarse cuando JSF desee para conseguirlos. Puede hacerlo añadiendo la siguiente entrada al <glassfish-web-app> de su /WEB-INF/glassfish-web.xml archivo:

<parameter-encoding default-charset="UTF-8"/> 

(nota: el archivo y entrada de la raíz está llamado anteriormente sun-web.xml y <sun-web-app> respectivamente)

anotados deben ser tan esto es específico de GlassFish y todo esto no funcionará cuando implemente la aplicación web en un servidor diferente.El enfoque independiente del servidor canónica es crear un servlet filter lo que hace básicamente lo siguiente puesto de trabajo en doFilter() método:

request.setCharacterEncoding("UTF-8"); 
chain.doFilter(request, response); 

y asegúrese de que ha sido asignado antes que cualquier otro filtro que necesita para recoger cualquier parámetros de la petición HTTP.


actualización: por qué GlassFish se ha fijado de antemano, es posiblemente causado por PrimeFaces. Ver también esta pregunta relacionada: Unicode input retrieved via PrimeFaces input components become corrupted.

+0

Bueno, eso funcionó. Gracias una vez más. Me pregunto por qué este tipo de información es tan difícil de encontrar. ¡Si no fuera por este servicio web, estaría aún más desesperadamente retrasado que yo! – AlanObject

+0

De nada. Se menciona, entre otros, en [wiki Glassfish] (http://wikis.sun.com/display/glassfish/FaqHttpRequestParameterEncoding) y en mi [blog Unicode] (http://balusc.blogspot.com/2009/05/unicode- how-to-get-characters-right.html # JSPServletRequest). – BalusC

+8

+1, usted es realmente un GENIO, cuando se trata de Java EE. Desearía poder tener tu cerebro :-) Conquistaré internet :-) –

0

Nada funcionó para mí sólo esta:

  1. administrador glassfish

  2. Configuraciones -> Servidor-config -> Logger Preferencias-> Niveles de registro

  3. Añadir registrador:

nombre de registrador: org.apache.catalina.connector.Request

Nivel de registro: Grave/Off

severa es mejor si cualquier error puede aparecer

Cuestiones relacionadas