J'ai créé un petit service Web Rest avec Jersey 1.11. Lorsque j'appelle l'URL qui renvoie Json, il y a des problèmes avec l'encodage des caractères pour les caractères non anglais. L'URL correspondante pour XML ("test.xml" le rend utf-8 dans la balise xml de départ.
Comment faire en sorte que l'URL "test.json" renvoie la réponse encodée en utf-8?
Voici le code pour le service:
@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();
}
}
C'est le pojo utilisé par le service:
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() {}
}
Jersey devrait toujours produire par défaut utf-8. Le problème vient du fait que votre client ne l’interprète pas correctement (la déclaration xml ne "rend" pas cela "utf-8, elle indique simplement au client comment l’analyser).
Avec quel client voyez-vous ces problèmes?
JSON valide est supposé être uniquement Unicode (utf-8/16/32); les analyseurs devraient pouvoir détecter le codage automatiquement (bien sûr, certains ne le font pas), il n'y a donc pas de déclaration de codage en JSON.
Vous pouvez l'ajouter au Content-Type
comme suit:
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
Si l'ajout du jeu de caractères à chaque ressource n'est pas une option, peut-être que la réponse à cette question , qui montre comment appliquer un jeu de caractères par défaut, peut être utile.
responseMessage
est une classe de beans dans laquelle nous pouvons envoyer UTF-8 charset
en réponse.
return Response.ok(responseMessage).header("Content-Type", "application/json;charset=UTF-8").build();
si @Produces (MediaType.APPLICATION_JSON + "; charset = utf-8") ne fonctionne pas, essayez alors:
@Produces ("application/json; charset = utf-8")
en théorie c'est pareil, mais la première option ne m'a pas fonctionné
Vous pouvez aussi essayer ceci:
return Response.ok(responseMessage, "application/json;charset=UTF-8").build();
Jersey est défectueux. Lorsque Content-Type application/json est utilisé, il ne détecte pas le codage JSON unicode automatiquement comme il le suppose, mais désérialise le corps de la requête avec le codage de la plate-forme d'exécution utilisé par votre serveur. Il en va de même pour la sérialisation du corps de la réponse.
Votre client doit spécifier explicitement le jeu de caractères UTF-8:
Content-Type: application/json;charset=utf-8