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