jsf-2 - descargar - download jsf 2.0 mojarra 2.0 3 fcs
Cómo deshacerse de WARNING: PWC4011: no se puede establecer la codificación de caracteres de solicitud en UTF-8 (2)
Nada funcionó para mí solo esto:
Glassfish administrador
Configuraciones -> server-config -> Logger Settings-> Log Levels
Agregar registrador:
Nombre del registrador: org.apache.catalina.connector.Request
Nivel de registro : grave / apagado
Grave es mejor si puede aparecer algún error
Esto es en GlassFish 3.1, usando PrimeFaces sobre Mojarra y salado con MyFaces CODI. En casi todas las solicitudes aparece el siguiente mensaje:
ADVERTENCIA: PWC4011: no se puede establecer la codificación de caracteres de solicitud en UTF-8 desde el contexto /com.myapp_war_0.1, porque los parámetros de solicitud ya se han leído, o ya se ha llamado a ServletRequest.getReader ()
Esto ha sucedido desde que comencé el proyecto, hasta ahora lo he estado ignorando, pero ahora me he dado cuenta de que estoy perdiendo mucho tiempo leyendo sobre él. Encontré un trabajo interesante pero incompleto here , pero no lo entiendo.
¿Puede alguien sugerir cómo controlar este mensaje sin suprimir otros posibles mensajes de advertencia?
JSF / Facelets usa 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 que JSF haya establecido la codificación del parámetro de solicitud en UTF-8, se analizará (incorrectamente) utilizando ISO-8859-1.
Cuando JSF necesita establecer la codificación del parámetro de solicitud durante la fase de restauración de la vista de la siguiente manera,
request.setCharacterEncoding("UTF-8");
mientras los parámetros de solicitud ya están analizados, GlassFish mostrará exactamente esta advertencia.
La consecuencia no deseada es que todos esos parámetros de solicitud HTTP posiblemente terminen en Mojibake . Los datos del formulario se enviaron originalmente y se codificaron utilizando UTF-8. Si decodifica datos UTF-8 utilizando un juego de caracteres diferente como ISO-8859-1, entonces los caracteres en un 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 solicitar un parámetro de solicitud HTTP antes de que JSF haya establecido la codificación correcta. Básicamente, debe verificar todo el código que se ejecuta antes de la fase de restauración de JSF, como los filtros de servlet, los detectores 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 obtener ellos. Puede hacerlo agregando la siguiente entrada a la <glassfish-web-app>
de su archivo /WEB-INF/glassfish-web.xml
:
<parameter-encoding default-charset="UTF-8"/>
(nota: el archivo y la entrada raíz se llamaron anteriormente sun-web.xml
y <sun-web-app>
respectivamente)
Debe tenerse en cuenta que esto es específico de GlassFish y que esto no funcionará cuando implemente la aplicación web en un servidor diferente. El enfoque canónico independiente del servidor es crear un filtro de servlet que básicamente realiza el siguiente trabajo en el método doFilter()
:
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
y asegúrese de que haya sido mapeado antes que cualquier otro filtro que necesite recopilar los parámetros de solicitud HTTP.
Actualización : en cuanto a por qué GlassFish lo ha configurado de antemano, es posiblemente causado por PrimeFaces. Consulte también esta pregunta relacionada: la entrada Unicode recuperada a través de los componentes de entrada de PrimeFaces se daña .