Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why won't my Servlet respond to JSON requests in UTF-8?

My Servlet just won't use UTF-8 for JSON responses.

MyServlet.java:

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {

    PrintWriter writer = res.getWriter();

    res.setCharacterEncoding("UTF-8");
    res.setContentType("application/json; charset=UTF-8");

    writer.print(getSomeJson());
  }
}

But special characters aren't showing up, and when I check the headers that I'm getting back in Firebug, I see Content-Type: application/json;charset=ISO-8859-1.

I did a grep -ri iso . in my Servlet directory, and came up with nothing, so nowhere am I explicitly setting the type to ISO-8859-1.

I should also specify that I'm running this on Tomcat 7 in Eclipse with a J2EE target as a development environment, with Solaris 10 and whatever they call their web server environment (somebody else admins this) as the production environment, and the behavior is the same.

I've also confirmed that the request submitted is UTF-8, and only the response is ISO-8859-1.

Update

I have amended the code to reflect that I am calling PrintWriter before I set the character encoding. I omitted this from my original example, and now I realize that this was the source of my problem. I read here that you have to set character encoding before you call HttpServletResponse.getWriter(), or getWriter will set it to ISO-8859-1 for you.

This was my problem. So the above example should be adjusted to

public class MyServlet extends HttpServlet {

  protected void doPost(HttpServletRequest req, HttpServletResponse res) throws Exception {

    res.setCharacterEncoding("UTF-8");
    res.setContentType("application/json");

    PrintWriter writer = res.getWriter();
    writer.print(getSomeJson());
  }
}
like image 299
Justin Force Avatar asked Sep 17 '10 16:09

Justin Force


People also ask

Can servlet return JSON?

To send a JSON response from the Servlet we first need to convert the Employee object into its JSON representation. There are many java libraries available to convert an object to there JSON representation and vice versa. Most prominent of them would be the Gson and Jackson libraries.


1 Answers

Once the encoding is set for a response, it cannot be changed.

The easiest way to force UTF-8 is to create your own filter which is the first to peek at the response and set the encoding.

Take a look at how Spring 3.0 does this. Even if you can't use Spring in your project, maybe you can get some inspiration (make sure your company policy allows you to get inspiration from open source licenses).

like image 200
Leonel Avatar answered Oct 30 '22 01:10

Leonel