Comment puis-je passer un objet d'un ContainerRequestFilter à une ressource (post-matching) dans (JAX-RS) Resteasy version 3.0.11 qui a été incorporé et utilise Guice?Comment passer un objet de ContainerRequestFilter à la ressource
2
A
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.
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? –
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
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. –