JPA EntityManager and character encoding
This is my first time creating a simple site with JSPs, Servlets, Tomcat Server, MySQL and Netbeans (if that helps).
Thanks to JPA EntityManager , I can insert data into my database like this:
EntityManager entityManager = Persistence.createEntityManagerFactory("test").createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(usr);
entityManager.getTransaction().commit();
Where usr is the user of the Entity class created thanks to Netbeans. Everything works fine except for the fact that it doesn't support characters like accents.
Assuming I want to insert the word "cliché":
- If I try to print a value from my User class, everything is fine.
- When a value is submitted, if I try to select a value from my base, I have strange characters instead of "é"
The database fields are utf8_unicode_ci . If I try to do a simple INSERT query from MySQL like
INSERT INTO table (name) VALUES("ééé");
it works fine.
As I read on some websites, I changed my persistence.xml to the following line:
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull"/>
but the result is the same.
EDIT: Here are the properties of my User Class
@Entity
@Table(name = "users")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"),
@NamedQuery(name = "Users.findByIdUsers", query = "SELECT u FROM Users u WHERE u.idUsers = :idUsers"),
@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username"),
@NamedQuery(name = "Users.findByPasswd", query = "SELECT u FROM Users u WHERE u.passwd = :passwd"),
@NamedQuery(name = "Users.findByFirstName", query = "SELECT u FROM Users u WHERE u.firstName = :firstName"),
@NamedQuery(name = "Users.findByLastName", query = "SELECT u FROM Users u WHERE u.lastName = :lastName"),
@NamedQuery(name = "Users.findByEmail", query = "SELECT u FROM Users u WHERE u.email = :email"),
@NamedQuery(name = "Users.findByEmailAndPwd", query = "SELECT u FROM Users u WHERE u.email = :email AND u.passwd = :passwd")})
public class Users implements Serializable {
@Basic(optional = false)
@Column(name = "address")
private String address;
@Basic(optional = false)
@Column(name = "city")
private String city;
@Basic(optional = false)
@Column(name = "postal")
private String postal;
@Basic(optional = false)
@Column(name = "phone")
private String phone;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idUsers")
private Integer idUsers;
@Basic(optional = false)
@Column(name = "username")
private String username;
@Basic(optional = false)
@Column(name = "passwd")
private String passwd;
@Basic(optional = false)
@Column(name = "firstName")
private String firstName;
@Basic(optional = false)
@Column(name = "lastName")
private String lastName;
@Basic(optional = false)
@Column(name = "email")
private String email;
As I read online, I also tried to modify my catalina.bat by adding the following lines, but it didn't change anything.
set JAVA_OPTS =% JAVA_OPTS% -Djavax.servlet.request.encoding = UTF-8 -Dfile.encoding = UTF-8
Any help is greatly appreciated.
source to share
I was able to fix my problem thanks to the VGR answer here: HttpServletRequest UTF-8 Encoding
Many thanks for your help.
source to share
You can add unicode encoding filter to web.xml:
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
if you are using Spring you can use the org.springframework.web.filter.CharacterEncodingFilter class to encode all requests, otherwise you must use a different encoding class.
source to share