【问题标题】:Special characters with JPA, JDBC, and mysqlJPA、JDBC 和 mysql 的特殊字符
【发布时间】:2016-05-22 09:10:28
【问题描述】:

我在 Spring Boot 项目中使用 JPAJDBCMySQL。我对特殊字符有一些麻烦。 如果我通过JdbcTemplate 写一个SQL 查询,那就没问题了。我可以取回“á”字符。 但如果是通过JPA,那些字符是�-s。

架构的默认排序规则是 utf8_hungarian_ci,默认字符集是 utf8。

我的application.properties

spring.jpa.database: MYSQL
spring.jpa.hibernate.ddl-auto: update   

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url: jdbc:mysql://localhost:3306/databasename?useUnicode=yes&characterEncoding=UTF-8
spring.datasource.username: root
spring.datasource.password: password

我有两个表,useruserroles,它们通过可连接的 @ManyToMany 关系连接。

User.java:

@ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "user_userrole",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "userrole_id", referencedColumnName = "id"))
    private List<UserRole> userRoles;
public List<UserRole> getUserRoles() {
        return userRoles;
    }

UserRole.java:

@ManyToMany(mappedBy = "userRoles")
    private List<User> users;

当我调用这个方法时:

currentUser.getUserRoles();

所有“á”字符都替换为 �-s。 我错过了什么?

编辑:

我在数据库中添加了一个新用户:árvíztűrő tükörfúrógép。 (我可以毫无问题地做到这一点,顺便说一下,我也用 jpa 保存了用户。) 但是当我尝试登录时,我遇到了这个异常:

error":"Internal Server Error","exception":"java.io.CharConversionException"
,"message":"Not an ISO 8859-1 character: ű"

pom.xml:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
</properties>

【问题讨论】:

    标签: jpa jdbc encoding utf-8 spring-lemon


    【解决方案1】:
    <property name="hibernate.connection.useUnicode" value="true" />
    <property name="hibernate.connection.characterEncoding" value="UTF-8" />
    

    使用休眠 4.3.1 可以:

    <property name="connection.useUnicode">true</property>
    <property name="connection.characterEncoding">utf-8</property>
    

    【讨论】:

    • 我使用 application.properties,而不是 xml-s。但是,我像这样添加了这些行: hibernate.connection.useUnicode=true hibernate.connection.characterEncoding=UTF-8 connection.useUnicode=true connection.characterEncoding=utf-8 但是什么也没发生。此外,它们还有“未知属性”警告。
    • 您可以尝试使用如下连接 url:jdbc:mysql://localhost:3306/mydb?useUnicode=true&connectionCollat​​ion=utf8_general_ci&characterSetResults=utf8&characterEncoding=utf8
    • 它没有帮助。但是从java.io.CharConversionException 我想这不是jpa或hibernate的错,java本身有些问题......
    • 不是jpa或者hibernate可以在tomcat或者maven级别配置
    • 您可以在 web.xml 中添加连接 url 以解决上述错误
    【解决方案2】:

    请在下面的 web xml 中添加

    <filter>
        <filter-name>SetCharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>SetCharacterEncodingFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>
    

    【讨论】:

    • 我没有在我的项目中使用 web.xml,因为我使用的是 Spring Boot。但是,我将此添加到 Tomcat 的 web.xml 中,并且我将 org.apache.catalina.filters.SetCharacterEncodingFilter 部分取消评论,但没有任何反应。
    • 这是关于如何在嵌入式 Tomcat 服务器中配置过滤器的 Spring Boot 文档 -> docs.spring.io/spring-boot/docs/current/reference/html/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多