Java 如何将Grizzly请求注入Jersey ContainerRequestFilter

Java 如何将Grizzly请求注入Jersey ContainerRequestFilter,java,jersey,jersey-2.0,grizzly,Java,Jersey,Jersey 2.0,Grizzly,我的球衣是由灰熊提供的 我有一个ContainerRequestFilter实现类。但是,为所有传入请求创建一次此类。因此,这样做: public class EndpointRequestFilter implements ContainerRequestFilter { @Context private org.glassfish.grizzly.http.server.Request requestContext; public void filter( Cont

我的球衣是由灰熊提供的

我有一个
ContainerRequestFilter
实现类。但是,为所有传入请求创建一次此类。因此,这样做:

public class EndpointRequestFilter implements ContainerRequestFilter {
    @Context
    private org.glassfish.grizzly.http.server.Request requestContext;

    public void filter( ContainerRequestContext req ) throws IOException {
       // remove for sake of example
    }
}
requestContext
为空。我可以将上下文注入到被调用的实际端点中,但这相当粗糙和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,您希望在请求的ResponseFilter端获取此
请求
对象

必须有一个简单的方法来做到这一点。到目前为止,我看到的所有问题/答案都不适用于Grizzly或REST端点调用的方法的注入。我不希望仅仅因为我想得到IP地址就在调用中添加这个方法


那么这里的关键是什么?我遗漏了什么?

我很惊讶你居然让应用程序运行,以至于你可以发现请求为空。每当我尝试运行它时,启动时都会出现异常,表示没有请求范围,因此无法注入请求,这是我所期望的。虽然我无法复制NPE,但我认为这个解决方案仍然可以解决您的问题

因此,
请求
是一个请求范围的对象,因为它在每次请求时都会发生变化。但过滤器本质上是一个单体。所以你需要做的,就是懒洋洋地找回它。为此,我们可以使用,作为一种惰性检索机制

回到我第一段的要点,这是我在创业时遇到的一个例外

java.lang.IllegalStateException:不在请求范围内

这是有意义的,因为
请求
需要与请求范围相关联,并且在启动时,没有关联。请求作用域仅在请求期间存在

因此,使用
提供程序
所做的是,当存在请求范围时,允许我们尝试获取
请求

public static class Filter implements ContainerRequestFilter {

    @Context
    private javax.inject.Provider<Request> requestProvider;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final Request request = requestProvider.get();
        System.out.println(request.getRemoteAddr());
    } 
}
公共静态类筛选器实现ContainerRequestFilter{
@上下文
private javax.inject.Provider requestProvider;
@凌驾
公共无效筛选器(ContainerRequestContext requestContext)引发IOException{
最终请求=requestProvider.get();
System.out.println(request.getRemoteAddr());
} 
}
我已经测试过了,它的工作原理和预期的一样

另请参见:


我很惊讶你居然让应用程序运行,以至于你可以发现请求为空。每当我尝试运行它时,启动时都会出现异常,表示没有请求范围,因此无法注入请求,这是我所期望的。虽然我无法复制NPE,但我认为这个解决方案仍然可以解决您的问题

因此,
请求
是一个请求范围的对象,因为它在每次请求时都会发生变化。但过滤器本质上是一个单体。所以你需要做的,就是懒洋洋地找回它。为此,我们可以使用,作为一种惰性检索机制

回到我第一段的要点,这是我在创业时遇到的一个例外

java.lang.IllegalStateException:不在请求范围内

这是有意义的,因为
请求
需要与请求范围相关联,并且在启动时,没有关联。请求作用域仅在请求期间存在

因此,使用
提供程序
所做的是,当存在请求范围时,允许我们尝试获取
请求

public static class Filter implements ContainerRequestFilter {

    @Context
    private javax.inject.Provider<Request> requestProvider;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        final Request request = requestProvider.get();
        System.out.println(request.getRemoteAddr());
    } 
}
公共静态类筛选器实现ContainerRequestFilter{
@上下文
private javax.inject.Provider requestProvider;
@凌驾
公共无效筛选器(ContainerRequestContext requestContext)引发IOException{
最终请求=requestProvider.get();
System.out.println(request.getRemoteAddr());
} 
}
我已经测试过了,它的工作原理和预期的一样

另请参见:


好东西,谢谢。让它工作的关键是在Provider类中包装它。成功了,好东西,谢谢。让它工作的关键是在Provider类中包装它。这就成功了。