SRG and martins solution worked well for me.
However, I had to apply the following changes to the filter:
If a customer executes an Accept header request, Jersey adds a quality factor to the content type. It looks like this:
No problem: request without Accept header:
curl -i http://www.example.com/my-rest-endpoint
response.getMediaType().toString() application/json . We can just add ;charset=utf-8 .
Problem: Request with Accept header:
curl -i -H "Accept: application/json" http://www.example.com/my-rest-endpoint
response.getMediaType().toString() is {application/json, q=1000} . We cannot just add ;charset=utf-8 , as this will result in the following exception:
java.lang.IllegalArgumentException: Error parsing media type '{application/json, q=1000};charset=utf-8' at org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:92) ~[na:na] at org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:60) ~[na:na] at javax.ws.rs.core.MediaType.valueOf(MediaType.java:179) ~[na:na] ... Caused by: java.text.ParseException: Next event is not a Token at org.glassfish.jersey.message.internal.HttpHeaderReader.nextToken(HttpHeaderReader.java:129) ~[na:na] at org.glassfish.jersey.message.internal.MediaTypeProvider.valueOf(MediaTypeProvider.java:110) ~[na:na] at org.glassfish.jersey.message.internal.MediaTypeProvider.fromString(MediaTypeProvider.java:90) ~[na:na] ... 193 common frames omitted
I would suggest the following code to solve this problem:
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.MediaType; public class CharsetResponseFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext request, ContainerResponseContext response) { MediaType type = response.getMediaType(); if (type != null) { if (!type.getParameters().containsKey(MediaType.CHARSET_PARAMETER)) { MediaType typeWithCharset = type.withCharset("utf-8"); response.getHeaders().putSingle("Content-Type", typeWithCharset); } } } }
rzueger Mar 14 '15 at 18:26 2015-03-14 18:26
source share