2012-02-20 12 views
41

Ho creato un piccolo servizio web di Rest utilizzando Jersey 1.11. Quando chiamo l'url che restituisce Json, ci sono problemi con la codifica dei caratteri per i caratteri non inglesi. L'URL corrispondente per XML ("test.xml" rende utf-8 in partenza xml-tag.jersey web service codifica json utf-8

Come posso fare l'url "test.json" ritorno di risposta codifica UTF-8?

Ecco il codice per il servizio:

@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(); 
    } 
} 

Questo è il POJO che il servizio utilizza:

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

possibile duplicato di [? Come impostare il set di caratteri con JAX-RS] (http://stackoverflow.com/questions/3431996/how -to-set-the-charset-with-jax-rs) – rds

risposta

87

Jersey dovrebbe sempre produrre utf-8 per default, suona come il problema è che il client non è interpretariato correttamente (la dichiarazione xml non "rende" utf-8, dice semplicemente al client come analizzarla).

Con quale client vedi questi problemi?

JSON valido deve essere solo Unicode (utf-8/16/32); i parser dovrebbero essere in grado di rilevare automaticamente la codifica (ovviamente alcuni non lo fanno), quindi non c'è alcuna dichiarazione di codifica in JSON.

È possibile aggiungere alla Content-Type in questo modo:

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

Stavo vedendo il problema sia con il mio browser Chrome sia con un client di resto da google, ma il tuo suggerimento risolve il problema :) – Jojje

+1

Nel mio caso, con la maglia 1.2 anche risolve il problema, grazie –

+1

2015 e ho ancora il problema –

5

Se aggiungendo il set di caratteri per ogni risorsa non è un'opzione, forse la risposta a this question, che mostra come applicare un set di caratteri di default, potrebbe essere utile.

3

responseMessage è una classe di bean in cui è possibile inviare UTF-8 charset in risposta.

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

se @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") non funziona, quindi provare:

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

in teoria è la stessa, ma la prima opzione non ha funzionato per me

0

si può anche provare questo:

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

Jersey è buggato, quando viene utilizzata l'applicazione Content-Type/json, non rileva automaticamente la codifica JSON Unicode come suppone, ma deserializza il corpo della richiesta con qualsiasi codifica della piattaforma di runtime utilizzata dal server. Lo stesso vale per la serializzazione del corpo di risposta.

Il suo cliente necessità di specificare in modo esplicito UTF-8 charset:

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