如何将Grizzly请求注入Jersey ContainerRequestFilter
我有泽西由Grizzly提供。
我有一个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
为null。 我可以将上下文注入到被调用的实际端点中,但这是相当粗糙和丑陋的,对我来说真的没用; 因为我想记录各种要求。 理想情况下,希望在Request
的ResponseFilter端获取此Request
对象。
必须有一种简单的方法来做到这一点。 到目前为止,我看到的所有问题/答案都不适用于Grizzly或注入REST端点调用的方法。 我不想绕过我所有的数百种方法,只是因为我想得到IP地址!
那么这里的关键是什么? 我错过了什么?
我很惊讶你甚至让应用程序运行,以达到你可以发现请求为空的程度。 每当我尝试运行它时,我会在启动时遇到exception,说没有请求范围,因此无法注入请求,这就是我的预期。 虽然我无法重现NPE,但我认为这个解决方案仍然可以解决您的问题。
所以Request
是一个请求范围的对象,因为它在每个请求上都会发生变化。 但filter本质上是一个单身人士。 所以你需要做的是懒洋洋地检索它。 为此,我们可以使用javax.inject.Provider
作为惰性检索机制。
回到我的第一段中的这一点,这是我启动时的例外
java.lang.IllegalStateException:不在请求范围内。
这是有道理的,因为Request
需要与请求范围相关联,并且在启动时,没有。 请求范围仅在请求期间出现。
因此,使用Provider
所做的是允许我们在存在请求范围时尝试获取Request
。
public static class Filter implements ContainerRequestFilter { @Context private javax.inject.Provider requestProvider; @Override public void filter(ContainerRequestContext requestContext) throws IOException { final Request request = requestProvider.get(); System.out.println(request.getRemoteAddr()); } }
我测试了这个,它按预期工作。
也可以看看:
- 使用HK2和Jersey将请求范围对象注入Singleton Scoped对象
- setOnClickListener导致“RuntimeException:无法启动” – NullPointerException
- 将onClick监听器添加到gridView项目(根据位置启动唯一意图)