Comment configurer le jeu de caractères avec JAX-RS?
@Produces("text/html; charset=UTF-8")
mais cela a été ignoré et seulement text/html
a été envoyer avec l'en-tête HTTP. Je veux mettre le jeu de caractères dans un MessageBodyWriter, mais je ne veux pas extraire le type de média en analysant l'annotation @produce via réflexion par moi-même.
7 réponses
@Produces
syntaxe. De sorte que vous pouvez simplement utiliser:
@Produces("text/html; charset=UTF-8")
il est également possible d'utiliser Responsiebuilder.tête.(.. méthode pour définir le type de contenu avec le jeu de caractères. Voir ci-dessous pour un exemple de code (utilisant JAX-RS 1.1.1, CXF 2.3.1).
final Response myResponse = Response.status(Response.Status.BAD_REQUEST)
.entity("La requête n'est pas correcte.\n ...")
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_PLAIN+"; charset=ISO-8859-15" )
.build();
si vous voulez faire cela d'une manière neutre dans L'implémentation de JAX-RS, vous pouvez être en mesure de réinitialiser le type de contenu dans le MessageBodyWriter. Quelque chose comme:
public void writeTo(Object obj,
Class<?> cls,
Type type,
Annotation[] annotations,
MediaType mt,
MultivaluedMap<String, Object> responseHttpHeaders,
OutputStream stream) throws IOException {
responseHttpHeaders.putSingle(javax.ws.rs.core.HttpHeaders.CONTENT_TYPE, mt.toString() + ";charset=UTF-8");
}
si vous avez des jeux de caractères différents en plus de UTF-8 par méthode de Ressource, vous pouvez créer une annotation personnalisée et l'ajouter à chaque méthode de ressource. Ensuite, essayez d'utiliser le paramètre annotations dans la méthode writeTo ().
Juste pour info, Apache Clin D'Oeil supporte l'utilisation de charset et d'autres les attributs sur les types de médias. J'espère que les révisions futures des spécifications JAX-RS faciliteront cette tâche.
Juste pour le garder à jour. Je ne sais pas si cela a été pris en charge dans les versions plus anciennes De Jersey, mais certainement si vous décidez d'utiliser Responsabilbuilder.tête.(..) méthode vous pouvez utiliser la méthode MediaType withCharset (). Comme ceci:
return Response.status(Status.OK)
.entity(result)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_TYPE.withCharset("utf-8"))
.build());
ce que je fais est d'obtenir une instance de l'objet servlet response:
protected @Context HttpServletResponse response;
et ensuite définir l'encodage des caractères à utf-8:
response.setCharacterEncoding("utf-8");
Qui fonctionne pour moi.
si vous utilisez RESTEasy vous pouvez enregistrer un Inteceptor:
import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.interception.PreProcessInterceptor;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
@Provider
@ServerInterceptor
public class ContentTypeSetter implements PreProcessInterceptor {
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker resourceMethodInvoker) throws Failure, WebApplicationException {
request.setAttribute(InputPart.DEFAULT_CONTENT_TYPE_PROPERTY, "*/*; charset=UTF-8");
return null;
}
}
Note: Si vous définissez manuellement a @produit il l'emporte sur le ContentType défini par cet intercepteur. Si vous faites cela, mettez le jeu de caractères dans @produit
installation @Produces
annotation sur les méthodes de votre classe ressource.
Puis MessageBodyWriter
de votre retour, vous pouvez le faire dans writeTo()
méthode:
response.setContentType(mediaType.toString);
Remarque: Vous pouvez injecter response
dans votre writer
par:
@Context
protected HttpServletResponse response;