Comment définir le jeu de caractères avec JAX-RS?
Comment puis-je définir le jeu de caractères avec JAX-RS? J'ai essayé @Produces("text/html; charset=UTF-8")
mais qui a été ignorés et que text/html
a été envoyer avec l'en-tête HTTP. Je veux définir le jeu de caractères à l'intérieur d'un MessageBodyWriter, mais ne voulez pas extraire le type de média, par analyse de @Produit annotation par réflexion par moi-même.
@Produces("text/html; charset=UTF-8")
fonctionne avec les versions actuelles de l'implémentation de référence de Jersey.- Vous pouvez également vérifier ce qui se passe partout pour tous @Produit("text/html") des annotations à l'aide de la technique décrit ici sur une semblable question.
Vous devez vous connecter pour publier un commentaire.
Que le Démon l'a souligné dans un commentaire, les dernières versions de JAX-RS (y compris la version stable en septembre 2012) maintenant ne l'appui de la
@Produces
de la syntaxe. De sorte que vous pouvez simplement utiliser:@Produces(MediaType.APPLICATION_JSON + "; charset=UTF-16")
, mais cela ne fonctionne pas.Il est également possible d'utiliser ResponseBuilder.l'en-tête(...) la méthode pour définir le type de contenu avec le jeu de caractères. Voir ci-dessous pour un exemple de code (à l'aide de JAX-RS 1.1.1, CXF 2.3.1).
type()
méthode:Response.status(Response.Status.BAR_REQUEST).entity("La requête n'est pas correcte.\n ...").type(MediaType.TEXT_PLAIN + "; charset=ISO-8859-15").build();
Juste pour le garder à jour. Pas sûr que cela a été pris en charge dans les versions plus anciennes de Jersey, mais certainement si vous décidez d'utiliser ResponseBuilder.l'en-tête(...) la méthode que vous pouvez utiliser MediaType méthode withCharset(). Comme ceci:
javax.ws.rs.core.Response.ResponseBuilder.type(MediaType)
au lieu dejavax.ws.rs.core.Response.ResponseBuilder.header(HttpHeaders.CONTENT_TYPE, Object)
Si vous voulez le faire dans un JAX-RS de mise en œuvre de manière neutre, vous pouvez être en mesure de réinitialiser le Type de Contenu dans la MessageBodyWriter. Quelque chose comme:
Si vous avez des jeux de caractères différents, hormis l'UTF-8 par méthode, vous pouvez créer un profil pour l'annotation et l'ajouter à chaque méthode. Ensuite, essayez d'utiliser les annotations paramètre dans la writeTo() la méthode.
Juste pour info, Apache Clin D'Oeil prend en charge l'utilisation du jeu de caractères et d'autres attributs de types de médias. J'espère que l'avenir de JAX-RS spec révisions rend cela plus facile.
De l'installation de la
@Produces
annotation sur votre ressource méthodes de la classe.Puis dans
MessageBodyWriter
de votre retour, vous pouvez le faire danswriteTo()
méthode:Remarque: Vous pouvez injecter
response
dans votrewriter
par:Ce que je fais, c'est pour obtenir une instance de la servlet objet de réponse:
Puis définir l'encodage de caractères utf-8:
Qui fonctionne pour moi.
Si vous utilisez RESTEasy vous pouvez enregistrer un Inteceptor:
Remarque: Si vous définissez manuellement un @Produit il remplace le ContentType fixé par l'intercepteur. Si vous faites cela, définir le jeu de caractères dans @Produit