2012-02-20 25 views
41

Hice un pequeño servicio web Rest usando Jersey 1.11. Cuando llamo a la url que devuelve Json, hay problemas con la codificación de caracteres para caracteres no ingleses. La url correspondiente para XML ("test.xml" hace que sea UTF-8 en el xml-tag de apertura.jersey web service codificación json utf-8

¿Cómo puedo hacer la url "test.json" retorno respuesta codificación UTF-8?

está aquí el código del servicio:

@Stateless 
@Path("/") 
public class RestTest { 
    @EJB 
    private MyDao myDao; 

    @Path("test.xml/") 
    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    public List<Profile> getProfiles() {  
     return myDao.getProfilesForWeb(); 
    } 

    @Path("test.json/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Profile> getProfilesAsJson() { 
     return myDao.getProfilesForWeb(); 
    } 
} 

Este es el POJO que el servicio utiliza:

package se.kc.mimee.profile.model; 

@XmlRootElement 
public class Profile { 
    public int id; 
    public String name; 

    public Profile(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    public Profile() {} 

} 
+0

posible duplicado de [? Cómo configurar el juego de caracteres con JAX-RS] (http://stackoverflow.com/questions/3431996/how -to-set-the-charset-with-jax-rs) – rds

Respuesta

87

Jersey siempre debe producir UTF-8 por omisión, parece que el problema es que su cliente no es interpretar es correcto (la declaración xml no lo "convierte" en utf-8, simplemente le dice al cliente cómo analizarlo).

¿Con qué cliente está viendo estos problemas?

Se supone que JSON válido es Unicode (utf-8/16/32); los analizadores deberían ser capaces de detectar la codificación automáticamente (por supuesto, algunos no), por lo que no hay declaración de codificación en JSON.

Puede añadirlo a la Content-Type así:

@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") 
+2

Estaba viendo el problema con mi navegador Chrome y un cliente de reposo de Google, pero su sugerencia solucionó el problema :) – Jojje

+1

En mi caso, con el jersey 1.2 también corrige el problema, gracias –

+1

2015 y todavía tengo el problema –

5

Si se añade el juego de caracteres a todos y cada uno de los recursos no es una opción, tal vez la respuesta a this question, que muestra cómo hacer cumplir un conjunto de caracteres por defecto, podría ser útil.

3

responseMessage es una clase de bean en la que podemos enviar UTF-8 charset en respuesta.

return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build(); 
3

si @Produces (MediaType.APPLICATION_JSON + "; charset = UTF-8") no funciona, a continuación, intentar:

@Produces ("application/json; charset = UTF-8")

en teoría es la misma, pero la primera opción no funcionó para mí

0

también puede probar esto:

return Response.ok(responseMessage, "application/json;charset=UTF-8").build(); 
0

Jersey tiene errores, cuando se usa Content-Type application/json, no detecta la codificación JSON unicode automáticamente, pero deserializa el cuerpo de la solicitud con la codificación de plataforma de tiempo de ejecución utilizada por su servidor. Lo mismo aplica para la serialización del cuerpo de respuesta.

Su necesidad del cliente para especificar explícitamente charset UTF-8:

Content-Type: application/json;charset=utf-8