We are to enable UTF-8 character encoding to our web application designed using JSF2.0, Hibernate, MySQL.
Following is the datasource defined in our application context file
<bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dbname" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="5" />
<property name="useUnicode" value="yes" />
<property name="characterEncoding" value="UTF-8" />
</bean>
While running the application we are getting exception
Error creating bean with name 'SessionFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Cannot resolve reference to bean 'DataSource' Error creating bean with name 'DataSource' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invalid property 'useUnicode' of bean class [com.mchange.v2.c3p0.ComboPooledDataSource]: Bean property 'useUnicode' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
We have also tried using the following but get an error
<bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dbname?useUnicode=yes&characterEncoding=UTF-8;" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="5" />
</bean>
Error: The reference to entity "characterEncoding" must end with the ';' delimiter
After some work around I am able to handle the issue- Following is the code that is working for me to enable JDBC working with UTF8
<bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="5" />
</bean>
Using useUnicode=true&characterEncoding=UTF-8
with &
served the purpose
To be able to use the same with Hibernate also specify the following to the hibernate properties
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.connection.charSet">UTF-8</prop>
</props>
</property>
Specify request encoding format in the filter as well
public class ApplicationFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
Now even if your application and db are not supporting special characters check the database character set , try by recreating the database and using charset UTF8 instead latin1
When you install MySQL with the UI installer, you can set the default character set as 'UTF-8'. After that everything works fine. I always set this at installation time so I don't know how to set it later. But if you don't want to reinstall MySQL, check this link:
How do i Setup utf-8 as standard character set for a mysql server?
来源:https://stackoverflow.com/questions/21037154/enabling-utf-8-character-set-in-jsf2-0-hibernate-mysql