JPA的Servlet字符编码问题

时间:2014-01-11 21:46:36

标签: java servlets character-encoding cdi wildfly

好的,我花了七小时谷歌搜索和测试,我放弃了,我必须寻求帮助。 我以前用Linux开发,一切都很简单,现在我使用windows,设置正确的语言环境等简单的东西不起作用。

我使用form:

创建了简单的JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<form action="save-user" method="post">
    Name: <input type="text" name="name"><br>
    Email: <input type="text" name="email"><br>
    <input type="submit" value="Save">
</form>

和Servlet:

    String name = request.getParameter("name");
    String email = request.getParameter("email");

我收到LeoÅ而不是Leoš。我使用WildFly 8.0RC1,Windows 8捷克语,firefox。

我已经尝试过了:

  1. request.setCharacterEncoding( “UTF-8”);先阅读之前 参数
  2. 使用request.setCharacterEncoding(“UTF-8”);
  3. 进行过滤
  4. JVM属性-Dfile.encoding = UTF-8
  5. 从战争中删除标准JEE堆栈
  6. 修复战争包装
  7. 将项目拆分为WEB和EJB模块
  8. 当部署JPA实体/ DAO时,变音符号会被破坏。如果我从servlet注释掉实体并从war中删除JPA实体(当前从WEB-INF / lib中删除OAuthLoginEJB.jar),那么我会收到正确的编码。如果我再添加这个EJB,它会再次失败。它是JBoss / WildFly的bug吗?

    我可以提供完整的来源:https://drive.google.com/file/d/0B-adlc5KThQDWTdYOEwxOUpTVEU/edit?usp=sharing 它已准备好运行,您甚至不需要输入捷克字母,因为它们是预先填写的。谢谢

2 个答案:

答案 0 :(得分:2)

来自WildFly dev邮件列表的Marko向我指出了这个缺陷:https://issues.jboss.org/browse/CDI-411并解决了这个问题:http://weld.cdi-spec.org/documentation/#3

当我修改我的web.xml时,它开始起作用:

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cz.literak.demo.oauth.servlets.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
        <filter-name>CDI Conversation Filter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

答案 1 :(得分:1)

首先从请求InputStream读取之前需要调用request.setCharacterEncoding("UTF-8")。在servlet中设置编码之前,过滤器可以读取参数。可能在OAuthLoginEJB.jar或其他依赖项中有一些过滤器,它首先读取参数?通常,这是用于调试的一些参数...使用Servlet API 3.0,可以通过注释注册servlet和过滤器,因此可以注册一些过滤器,尽管空web.xml