球衣2-根据请求标头注册响应过滤器

时间:2019-08-26 17:05:47

标签: java jersey jax-rs jersey-2.0

我有两个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注入方法在ContainerResponseFilterContainerRequestFilter类中可以很好地工作。)

此外,如何仅基于标题运行一个过滤器?

0 个答案:

没有答案
相关问题