【问题标题】:ResourceInfo not injected into spring managed jersey filterResourceInfo 未注入弹簧管理的球衣过滤器
【发布时间】:2018-01-04 11:55:32
【问题描述】:

我在将 ResourceInfo 注入我的球衣过滤器时遇到问题。当有一个 spring 管理的过滤器实例时,注解 @Context 似乎不能正常工作。

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

第二个目标和我的情况很相似。

动态特性:

@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);
        }
    }

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

谢谢!

克里斯托夫

【问题讨论】:

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


    【解决方案1】:

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

    在您的情况下,我认为您没有任何理由需要手动将 ConfigurationController 传递给您实例化的 HttpCacheFilter。如果你只是像前面的例子一样注册类,它会自动被注入。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-30
      • 2013-01-23
      • 2013-05-13
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多