SpringWeb + Hibernate + Database encoding problems – solved!

Some time ago, I was investigating SmartClient (SmartGWT) and writting small app to connect via hibernate to MySQL database. During this tests I stuck with Polish locale problem. Such problems I’ve been facing not only this time, but many times in my career. Today, though it’s pretty easy, I will describe once for all how to solve the problem with web apps and Polish (but also any non english) encoding.

The first thing to be done is to set UTF-8 encodings in all web frontend files (*.html/*.jsp etc) by adding following code into tags:

Ok, this was easy and has nothing to do with database, but at least it makes sure, that localized characters will be displayed in proper way in the browser.

Second thing to do is to write filter which will set UTF-8 coding to requests and responses. It could look this:

public class ToukEncodingFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {

        response.setCharacterEncoding("UTF-8");

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

    }

}

 

Now, to make this filter running, the following lines have to be add to web.xml file:

CharacterEncodingFilter 
pl.touk.filters.ToukEncodingFilter 
CharacterEncodingFilter 
/*

Ok. So we have now all in web layer prepared. Now, to make it work with DB, the hibernate connection have to be configured like this:

url=jdbc:mysql:///?useUnicode=true&characterEncoding=UTF-8

It can be also done via hibernate properties.

Of course I assume, that database has UTF-8 encoding. I won’t write about this, becouse it is pretty well written all over internet. Just a little tip: it is easier to set this before creating any table ;-)

Last, but the most important thing, is to set jvm encoding parameters to UTF-8 and desired locale. If You are using Tomcat It can be done by modifying CATALINA_OPTS variable (in init script) by adding following options:

-Dfile.encoding=UTF-8 -Duser.country=PL -Duser.language=pl

That’s all!

You May Also Like

New HTTP Logger Grails plugin

I've wrote a new Grails plugin - httplogger. It logs:

  • request information (url, headers, cookies, method, body),
  • grails dispatch information (controller, action, parameters),
  • response information (elapsed time and body).

It is mostly useful for logging your REST traffic. Full HTTP web pages can be huge to log and generally waste your space. I suggest to map all of your REST controllers with the same path in UrlMappings, e.g. /rest/ and configure this plugin with this path.

Here is some simple output just to give you a taste of it.

17:16:00,331 INFO  filters.LogRawRequestInfoFilter  - 17:16:00,340 INFO  filters.LogRawRequestInfoFilter  - 17:16:00,342 INFO  filters.LogGrailsUrlsInfoFilter  - 17:16:00,731 INFO  filters.LogOutputResponseFilter  - >> #1 returned 200, took 405 ms.
17:16:00,745 INFO filters.LogOutputResponseFilter - >> #1 responded with '{count:0}'
17:18:55,799 INFO  filters.LogRawRequestInfoFilter  - 17:18:55,799 INFO  filters.LogRawRequestInfoFilter  - 17:18:55,800 INFO  filters.LogRawRequestInfoFilter  - 17:18:55,801 INFO  filters.LogOutputResponseFilter  - >> #2 returned 404, took 3 ms.
17:18:55,802 INFO filters.LogOutputResponseFilter - >> #2 responded with ''

Official plugin information can be found on Grails plugins website here: http://grails.org/plugins/httplogger or you can browse code on github: TouK/grails-httplogger.