2015-08-06 4 views

Répondre

2

La méthode ContainerRequestContext#setProperty stocke les valeurs qui sont synchronisées avec HttpServletRequest. Donc, avec JAX-RS ordinaire, vous pouvez stocker un attribut comme ceci:

@Provider 
public class SomeFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     requestContext.setProperty("someProperty", "someValue"); 
    } 

} 

Et après, vous pouvez l'obtenir dans votre classe de ressources:

@GET 
public Response someMethod(@Context org.jboss.resteasy.spi.HttpRequest request) { 
    return Response.ok(request.getAttribute("someProperty")).build(); 
} 

Avec CDI, vous pouvez également injecter un bean dans le filtre et la classe des ressources:

@Provider 
public class SomeFilter implements ContainerRequestFilter { 

    @Inject 
    private SomeBean someBean; 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     someBean.setFoo("bar"); 
    } 

} 

Dans votre classe de ressource:

@Inject 
private SomeBean someBean; 

@GET 
public Response someMethod() { 
    return Response.ok(someBean.getFoo()).build(); 
} 

Je m'attendrais à ce que la même chose fonctionne avec Guice.

Mise à jour: Comme @bakil a souligné correctement, vous devez utiliser un haricot @RequestScoped si l'objet que vous voulez passer ne doit être associé à la demande actuelle.

+0

Dans l'exemple CDI, je suppose que les paramètres requestContext/request ne sont que des distractions, et je suppose que SomeBean doit être annoté '@ RequestScoped' ou similaire? –

+0

Merci pour l'indice. J'ai enlevé les paramètres insensés. SomeBean doit être un bean CDI ce qui signifie qu'il peut avoir n'importe quelle portée CDI. '@ RequestScoped' pourrait avoir du sens dans la plupart des cas. – lefloh

+0

Si la portée '@ Dependent' par défaut est utilisée, le filtre et la classe de ressources recevront des instances SomeBean distinctes, de sorte que les données ne seront pas transférées. Je pense que vous avez besoin de '@ RequestScoped' pour vous assurer que la même instance est partagée par les deux. –