【问题标题】:How to inject Grizzly Request into Jersey ContainerRequestFilter如何将 Grizzly 请求注入 Jersey ContainerRequestFilter
【发布时间】:2016-06-10 04:23:24
【问题描述】:

我有灰熊提供的球衣。

我有一个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 端获取此 Request 对象。

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

那么这里的关键是什么?我错过了什么?

【问题讨论】:

    标签: java jersey jersey-2.0 grizzly


    【解决方案1】:

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

    所以Request 是一个请求范围的对象,因为它会随着每个请求而改变。但是过滤器本质上是一个单例。所以你需要做的是懒惰地检索它。为此,我们可以使用javax.inject.Provider,作为惰性检索机制。

    回到我第一段的重点,这是我在启动时遇到的异常

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

    这是有道理的,因为Request 需要与请求范围相关联,而在启动时,没有。请求范围仅在请求期间存在。

    那么使用Provider 所做的就是允许我们在存在请求范围时尝试获取Request

    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());
        } 
    }
    

    我已经对此进行了测试,它按预期工作。

    另请参阅:

    【讨论】:

    • 好东西谢谢。让它工作的关键是将它包装在 Provider 类中。成功了。
    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2015-11-03
    • 2015-04-21
    相关资源
    最近更新 更多