ResourceInfo未注入弹簧管理的球衣过滤器

时间:2017-07-28 12:03:09

标签: java spring jersey jersey-2.0 servlet-filters

我在将ResourceInfo注入我的泽西过滤器时遇到问题。在使用spring托管过滤器实例时,注释@Context似乎无法正常工作。

我发现的是: Jersey Request Filter only on certain URI

第二个目标与我的情况非常相似。

DynamicFeature:

@Provider
public class HttpCacheConfigDynamicFeature implements DynamicFeature {
    private final DefaultHttpCacheFilter defaultHttpCacheFilter;
    private final HttpCacheFilter httpCacheFilter;

    @Autowired
    public HttpCacheConfigDynamicFeature(DefaultHttpCacheFilter defaultHttpCacheFilter, HttpCacheFilter httpCacheFilter) {
        this.defaultHttpCacheFilter = defaultHttpCacheFilter;
        this.httpCacheFilter = httpCacheFilter;
    }
...

过滤器:

@Component
public class HttpCacheFilter implements ContainerResponseFilter {

    private Log logger = LogFactory.getLog(HttpCacheFilter.class);

    private final ConfigurationController configurationController;

    @Context
    private ResourceInfo resourceInfo;

    @Autowired
    public HttpCacheFilter(ConfigurationController configurationController) {
        this.configurationController = configurationController;
}
...

资源信息始终为空。

我现在要做的是将我的dynamicFeature改为:

@Provider
public class HttpCacheConfigDynamicFeature implements DynamicFeature {
    private final DefaultHttpCacheFilter defaultHttpCacheFilter;
    private final ConfigurationController configurationController;

    @Autowired
    public HttpCacheConfigDynamicFeature(DefaultHttpCacheFilter defaultHttpCacheFilter, ConfigurationController configurationController) {
        this.defaultHttpCacheFilter = defaultHttpCacheFilter;
        this.configurationController = configurationController;
    }


    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext featureContext) {
        if (hasHttpCacheConfigAnnotation(resourceInfo)) {
            featureContext.register(new HttpCacheFilter(configurationController, resourceInfo), 50);
        } else {
            featureContext.register(defaultHttpCacheFilter, 51);
        }
    }

也许你知道一种更优雅的方式来实现我的目标。

谢谢!

了Christoph

1 个答案:

答案 0 :(得分:0)

在正常情况下,它会起作用,因为泽西岛仍会注射它。但是DynamicFeature和注册实例存在一个已知问题。如果您将其注册为班级(即register(HttpCacheFilter.class)),则注射将起作用。

在您的情况下,我认为您无需手动将ConfigurationController传递给您实例化的HttpCacheFilter。如果您只是像上一个示例中那样注册该类,它将自动注入。

另外(未经测试)但我认为你甚至可以清理它,只需在过滤器的构造函数上使用@Inject。然后,您可以将ResourceInfoConfigurationController都作为构造函数参数。没什么大不了的,但对我来说只有一个注射点看起来更清洁。就像我说的,我没有测试它,但我很确定它会起作用。 @Inject@Context几乎可以与Jersey互换,你也可以在Jersey中使用@Inject作为Spring组件,所以我想它只是有效。