如何将对象从ContainerRequestFilter传递给Resource

Ari*_*Ari 3 java jax-rs resteasy undertow

我应该如何/应该将一个对象从ContainerRequestFilter传递给(JAX-RS)Resteasy版本3.0.11中的(后匹配)资源,该版本已嵌入并使用Guice?

lef*_*loh 5

方法ContainerRequestContext #setProperty存储与其同步的值HttpServletRequest.因此,使用普通的JAX-RS,您可以存储如下属性:

@Provider
public class SomeFilter implements ContainerRequestFilter {

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

}
Run Code Online (Sandbox Code Playgroud)

之后您可以在资源类中获取它:

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

使用CDI,您还可以在过滤器和资源类中注入任何bean:

@Provider
public class SomeFilter implements ContainerRequestFilter {

    @Inject
    private SomeBean someBean;

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

}
Run Code Online (Sandbox Code Playgroud)

在您的资源类中:

@Inject
private SomeBean someBean;

@GET
public Response someMethod() {
    return Response.ok(someBean.getFoo()).build();
}
Run Code Online (Sandbox Code Playgroud)

我希望与Guice一起工作.

更新:正如@bakil指出的那样,@RequestScoped如果要传递的对象只应与当前请求关联,则应使用bean.