如何解决“WARNING: PWC4011: Unable to set request character encoding to UTF-8”问题

23

这是在GlassFish 3.1上,使用Mojarra上的PrimeFaces并添加MyFaces CODI。几乎在每个请求中都会出现以下消息:

警告:PWC4011:无法将请求字符编码从上下文 /com.myapp_war_0.1 设置为UTF-8,因为已经读取了请求参数,或者已经调用了ServletRequest.getReader()

自从我开始该项目以来,就一直发生这种情况--到目前为止,我一直忽略它,但现在我意识到我浪费了很多时间在这方面阅读。我在这里找到了一个有趣但不完整的解决方法here,但我不明白它。

有没有人建议如何降低此消息的出现而不压制其他可能的警告消息?


根据我的经验,在升级mojarra版本后,这个著名的消息往往会丢失。你使用的是哪个版本? - andbi
@Osw:确实在早期的Mojarra 2.0.x版本中存在一个相关的bug,但那是由于一个略微不同的问题引起的,并且只影响Ajax请求。然而,OP正在使用捆绑JSF 2.1的GF 3.1。 - BalusC
@osw:具体来说,我正在使用GF 3.1.1 Build 12。我可能不应该这样做,但是我让Netbeans和GF在更新可用时都下载了所有更新。我记得几乎每个版本都有这个问题。随着我测试了很多页面并在此过程中生成了足够多的错误消息,我被刺激着采取行动解决它。顺便说一下,这个软件包中的Mojarra版本是2.1.3(FCS b02)。 - AlanObject
1个回答

42
JSF/Facelets默认使用UTF-8解码HTTP请求参数。GlassFish本身默认使用ISO-8859-1解码HTTP请求参数。HTTP请求参数只能被解析和解码一次,这发生在代码第一次请求请求参数时,例如request.getParameter("name")。因此,如果在JSF设置请求参数编码为UTF-8之前首次请求请求参数,则它将(错误地)使用ISO-8859-1进行解析。
当JSF需要在恢复视图阶段设置请求参数编码时,如下所示:
request.setCharacterEncoding("UTF-8");

如果请求参数已经被解析,那么GlassFish将显示这个警告。

不想要的后果是,所有这些HTTP请求参数可能最终会以乱码的形式出现。表单数据最初是使用UTF-8提交和编码的。如果您使用与ISO-8859-1等不同的字符集解码UTF-8数据,则8位范围及其后面的字符(通常是那些"特殊字符",如éàö等)将被损坏并最终出现为éà ö等。

从技术上讲,正确的解决方案是在JSF设置正确的编码之前请求HTTP请求参数。您基本上需要检查在JSF的恢复视图阶段之前运行的所有代码,例如servlet过滤器、阶段监听器等,是否正在执行该操作。

如果您似乎找不到它,或者代码超出了您的控制范围,那么您可以告诉GlassFish使用UTF-8来解码HTTP请求参数,这样当JSF想要获取它们时就不需要更改。您可以通过将以下条目添加到/WEB-INF/glassfish-web.xml文件的<glassfish-web-app>中来实现:

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

(注意:文件和根条目以前分别称为sun-web.xml<sun-web-app>

请注意,这仅适用于GlassFish,当您将Web应用程序部署到不同的服务器时,这些都将无法正常工作。规范的与服务器无关的方法是创建一个servlet过滤器,该过滤器在doFilter()方法中基本上执行以下工作:

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

确保在任何需要收集HTTP请求参数的过滤器之前,已将其映射。


更新: 为什么GlassFish事先设置它,可能是由于PrimeFaces引起的。另请参阅此相关问题: 通过PrimeFaces输入组件检索的Unicode输入会变得损坏


好的,这个方法可行。再次感谢。我想知道为什么这种信息很难找到?如果不是因为这个网络服务,我会比现在更加无助于进度落后! - AlanObject
不客气。这个信息在许多地方都有提到,包括Glassfish wiki和我的Unicode博客 - BalusC
8
+1,你在Java EE方面真是个天才。希望我也能有你的头脑 :) 我会征服互联网的 :) - nIcE cOw
@Allan:这个问题涉及到JSF 2.x。JSF 1.2默认情况下根本不使用UTF-8。需要进行更多的配置。或者,更好的方法是将旧版本升级到JSF 2.x。 - BalusC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接