2010-07-13 3 views
3

J'ai récemment mis en place un service Jersey JAX-RS Rest. J'ai créé un fournisseur JIBX qui permet de démarsaliser et de marshall entre les types XML et Java. Je voudrais également mettre à jour mon service en spécifiant la version dans le chemin de l'URL. Le versioning inclurait la version de la liaison de message utilisée pour marshaler et unmarshall les types Java. Par conséquent, il est nécessaire que la version soit transmise au fournisseur JIBX personnalisé, et par conséquent le chemin d'URL qui contient la version. Toutefois, les interfaces de fournisseur (MessageBodyWriter et MessageBodyReader) ne fournissent pas le chemin URI dans leurs méthodes d'interface.Passage du chemin d'accès URI aux fournisseurs JAX-RS

Ce qui suit est la signature de la méthode de la méthode writeTo() de l'interface MessageBodyWriter:

writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream) 

Ce paramètre méthode ne contient pas le chemin uri, par conséquent, le fournisseur de JiBX personnalisé ne peut pas savoir quelle version de liaison de message, il devrait utiliser pour marshall le type Java. Y a-t-il un moyen de contourner ceci?

+0

Corrigez-moi si je me trompe, mais Jersey implémente JAX-RS, pas JAX-WS – skaffman

+0

oh oui vous avez raison. mis à jour à JAX-RS – onejigtwojig

Répondre

8

Si vous voulez quelque chose de plus spécifique à JAX-RS qu'à HttpServletRequest, vous pouvez injecter un fichier javax.ws.rs.core.UriInfo.

public class MyProvider implements MessageBodyWriter { 
    @javax.ws.rs.core.Context 
    javax.ws.rs.core.UriInfo uriInfo; 
} 

Je suppose que vous utilisez un @ javax.ws.rs.PathParam pour capturer le paramètre de chemin. Vous pouvez ensuite utiliser potentiellement UriInfo.getPathParameters(). Vous pouvez également revenir à UriInfo.getPathSegments() pour obtenir les informations que vous recherchez. Cela vous évite d'avoir à analyser l'URI de la requête. Toute implémentation JAX-RS devrait être capable de le faire.

0

Vous pouvez accéder au chemin de l'URI à partir du fournisseur en définissant l'annotation @Context dans un champ du fournisseur.

Par exemple,

public class CustomProvider implements MessageBodyWriter 
{ 

    @Context HttpServletRequest request; 

    .... 
} 

Ce champ sera automatiquement pour chaque demande. Même si la demande est définie en tant que champ, la valeur est thread-safe car la demande réelle utilise un proxy et thread local probablement pour déterminer la requête qui appartient à thread.

Questions connexes