我有两个ContainerResponseFilter
用于请求方法,其中仅应运行一个。这是根据特定的请求标头决定的。
我创建了一个DynamicFeature
来检查此标头并相应地注册过滤器。
public class CustomFeature implements DynamicFeature {
@Context
HttpHeaders httpHeaders;
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
String value = httpHeaders.getHeaderString("x-something");
if (value != null && !value.isEmpty()) {
context.register(SomeFilter.class);
} else {
context.register(OtherFilter.class);
}
}
}
这将引发以下异常:
"java.lang.IllegalStateException: Not inside a request scope.
at org.glassfish.jersey.internal.guava.Preconditions.checkState(Preconditions.java:169)
at org.glassfish.jersey.process.internal.RequestScope.current(RequestScope.java:153)
at org.glassfish.jersey.inject.hk2.RequestContext.findOrCreate(RequestContext.java:55)
at org.jvnet.hk2.internal.MethodInterceptorImpl.internalInvoke(MethodInterceptorImpl.java:65)
at org.jvnet.hk2.internal.MethodInterceptorImpl.invoke(MethodInterceptorImpl.java:101)
...
我知道错误即将来临,因为在配置期间,没有请求,因此也没有标题。但是,这是我感到困惑的地方。根据{{3}},HttpHeaders
是代理服务器。因此,不应在处理请求时在此处插入代理并将其委托给实际实例吗? (看来,这种@Context
注入方法在ContainerResponseFilter
和ContainerRequestFilter
类中可以很好地工作。)
此外,如何仅基于标题运行一个过滤器?