grupos autónomos y Martins solución funcionó bien para mí.
Sin embargo, he tenido que aplicar los siguientes cambios en el filtro:
Si el cliente hace un pedido con una cabecera Accept, Jersey añade un factor de calidad para el tipo de contenido. Esto se ve de la siguiente manera:
No hay problema: solicitud sin cabecera Accept:
curl -i http://www.example.com/my-rest-endpoint
response.getMediaType().toString()
es application/json
. Simplemente podemos agregar ;charset=utf-8
.
Problema: solicitud con cabecera Accept:
curl -i -H "Accept: application/json" http://www.example.com/my-rest-endpoint
response.getMediaType().toString()
es {application/json, q=1000}
.No podemos simplemente añadir ;charset=utf-8
, ya que esto llevaría a la siguiente excepción:
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
me gustaría sugerir el siguiente código para resolver este problema:
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);
}
}
}
}
Cómo se volvieron? ¿Puedes mostrar algún resultado de muestra? –
Devuelve Löwe en lugar de Löwe (Lion en inglés) pero como dije si uso @Produces (MediaType.APPLICATION_JSON + "; charset = UTF-8") funciona ... –
Soy realmente el único que tiene ¿este problema? –