Comment configurer le jeu de caractères avec JAX-RS?

<!-Comment régler le jeu de caractères avec JAX-RS? J'ai essayé @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.

48
demandé sur deamon 2010-08-08 00:52:43

7 réponses

soutien @Produces syntaxe. De sorte que vous pouvez simplement utiliser:

@Produces("text/html; charset=UTF-8")
64
répondu Adrian Petrescu 2016-04-20 11:52:26

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();
15
répondu SMougenot 2011-08-30 21:13:35

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.

9
répondu Bryant Luk 2010-08-09 22:01:16

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());
9
répondu stviper 2015-07-31 08:39:18

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.

1
répondu Giannis 2016-08-24 13:01:01

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

1
répondu lujop 2016-12-07 16:41:02

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;
0
répondu To Kra 2016-08-23 09:40:37