令您惊讶的是,您甚至还运行了该应用程序,以至于您可以发现该请求为空。每当我尝试运行它时,我都会在启动时遇到异常,说没有请求范围,因此无法注入请求,这正是我所期望的。尽管我无法复制NPE,但我认为此解决方案仍然可以解决您的问题。
因此,它
Request是一个请求范围对象,因为它随每个请求而变化。但是过滤器的性质是单例。因此,您需要做的就是懒惰地检索它。为此,我们可以将
javax.inject.Provider用作延迟检索机制。
回到我的第一段,这是我刚开始时遇到的例外
java.lang.IllegalStateException:不在请求范围内。
这是有道理的,因为
Request需要与请求范围相关联,并且在启动时没有任何关联。请求范围仅在请求期间存在。
因此,使用
Providerdo的目的是让我们尝试
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()); } }我已经对此进行了测试,并且可以正常工作。
也可以看看:
- 使用HK2和Jersey将请求范围对象注入到单例范围对象中



