![](/img/trans.png)
[英]@Context injection not working in Jersey ContainerRequestFilter (Dropwizard)
[英]Guice + Jersey 2 + ContainerRequestFilter and @Context
我正在嘗試使用Guice將依賴項注入到通過DynamicFeature注冊的ContainerRequestFilter中。 我還需要Jersey來注入HttpServletRequest,我現在正試圖通過@Context來做到這一點。 這是一個Dropwizard應用程序。
我的最終目標是擁有一個通過DynamicFeature應用於特定資源的AuthenticationFilter。 我的AuthenticationFilter有一些必須注入的依賴項,它還需要訪問HttpServletRequest來完成它的工作。 這是Dropwizard項目的一部分,該模式基於Dropwizard的AuthDynamicFeature和AuthFilter,但經過修改以支持注入。
所以我的AuthenicationFilter看起來像這樣:
public class AuthFilter implements ContainerRequestFilter {
@Context
private HttpServletRequest httpServletRequest;
@Context
private HttpServletResponse httpServletResponse;
@Inject
private InjectableResource injectableResource;
public void filter(ContainerRequestContext requestContext) throws IOException {
// Do Auth
}
}
我的DynamicFeature看起來像這樣:
public class InjectableAuthDynamicFeature implements DynamicFeature {
// Have tried multiple methods to register fitlers: using Injector,
// using Provider and using the normal Class
@Inject
private Provider<AuthFilter> authFilterProvider;
@Inject
private Injector injector;
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
// Logic to decide on registering of filter followed by one of the
// following depending on injection method:
context.register(AuthFilter.class);
context.register(this.injector.getInstance(AuthFilter.class);
context.register(this.authFilterProvider.get());
}
}
不幸的是,我的AuthFilter永遠不會創建/運行我需要的所有依賴項。 如果我使用this.injector或this.authFilterProvider,那么我的@Inject字段是正確的,我的@Context字段不是。 我的理解是,這是因為我正在注冊該對象的實例,因此Jersey無法管理它/注入它的@Context字段。 但是,當我只是注冊該類時,我的@Context字段已注冊,但我的@Inject字段未注冊。
我可以做什么注冊/注入過程來確保在運行時正確填充@Context和@Inject?
另一條信息可能是有用的信息:如果我使用以下行注冊資源:
// AKA Dropwizard environment.jersey().register(...);
resourceConfig.register(this.injector.getInstance(MyResource.class));
MyResource包含@Context成員和@Inject成員,@ Context / @Inject成員在運行時都正確填充。 因此,由於某種原因,資源注冊和過濾器注冊/管理的行為有所不同。
任何想法/見解將不勝感激。
想想我可能會在這里找到答案。
您是否使用@Provider注釋注冊了dynamicFeature?
我相信這里可能發生的事情是HK2嘗試注冊您的DynamicFeature(以及您的過濾器),然后再設置Guice-HK2 Bridge。
為了解決這個問題,我會嘗試手動注冊你的功能,並從你的功能/過濾器類中刪除@Provider注釋。
即
// do your hk2 guice-bridge stuff before this
resourceConfig.register(InjectableAuthDynamicFeature.class)
如果它確實有效,我會稍后更新。
--EDIT - 完全錯誤w / above你之所以無法在ContainerRequestFilter中看到你的guice依賴,是因為GuiceScope類的可見性是LOCAL。
這基本上意味着只有父serviceLocator才能正確地為guice依賴提供服務。 ContainerRequestFilter / Mappers / Features都是由子serviceLocators創建的,因此無權解析GuiceScope上下文。
為了解決這個問題,我已經分叉了hk2 guice-bridge並重寫了GuiceScope以使用可見性NORMAL。
以下是代碼的鏈接: https : //github.com/hk2-project/hk2/blob/master/guice-bridge/src/main/java/org/jvnet/hk2/guice/bridge/internal/GuiceScopeContext。 Java的#L58
我不知道為什么有人沒有遇到這個問題,但似乎沒有任何理由限制了guice-bridge。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.