2017-07-28 80 views
0

我在注入ResourceInfo到球衣過濾器時遇到問題。當擁有一個Spring託管過濾器實例時,註解@Context似乎無法正常工作。ResourceInfo沒有注入到Spring管理球衣過濾器

我發現這是什麼: 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); 
     } 
    } 

也許你知道一個更優雅的方式來實現自己的目標。

謝謝!

克里斯托夫

回答

0

在正常情況下,它會工作,澤西仍然會注入它。但DynamicFeature和註冊實例存在已知問題。如果您將其註冊爲班級(即register(HttpCacheFilter.class)),則注射將起作用。

在你的情況,我看不到你需要手動將ConfigurationController傳遞給你實例化的HttpCacheFilter的任何理由。如果您像上一個示例中那樣註冊該類,它將自動注入。

另外(未測試),但我認爲你甚至可以清理它,只需在過濾器的構造函數上使用@Inject。然後,您可以同時使用ResourceInfoConfigurationController作爲構造函數參數。沒有什麼大不了的,但對我來說,只有一個注入點看起來更乾淨。就像我說的,我沒有測試它,但我很肯定它會起作用。 @Inject@Context與澤西島幾乎可以互換,並且您也可以在澤西島的Spring組件中使用@Inject,所以我會想象它只是起作用。