我在将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
答案 0 :(得分:0)
在正常情况下,它会起作用,因为泽西岛仍会注射它。但是DynamicFeature和注册实例存在一个已知问题。如果您将其注册为班级(即register(HttpCacheFilter.class)
),则注射将起作用。
在您的情况下,我认为您无需手动将ConfigurationController
传递给您实例化的HttpCacheFilter
。如果您只是像上一个示例中那样注册该类,它将自动注入。
另外(未经测试)但我认为你甚至可以清理它,只需在过滤器的构造函数上使用@Inject
。然后,您可以将ResourceInfo
和ConfigurationController
都作为构造函数参数。没什么大不了的,但对我来说只有一个注射点看起来更清洁。就像我说的,我没有测试它,但我很确定它会起作用。 @Inject
和@Context
几乎可以与Jersey互换,你也可以在Jersey中使用@Inject
作为Spring组件,所以我想它只是有效。