簡體   English   中英

Guice + Jersey 2 + ContainerRequestFilter和@Context

[英]Guice + Jersey 2 + ContainerRequestFilter and @Context

我正在嘗試使用Guice將依賴項注入到通過DynamicFeature注冊的ContainerRequestFilter中。 我還需要Jersey來注入HttpServletRequest,我現在正試圖通過@Context來做到這一點。 這是一個Dropwizard應用程序。

我的最終目標是擁有一個通過DynamicFeature應用於特定資源的AuthenticationFilter。 我的AuthenticationFilter有一些必須注入的依賴項,它還需要訪問HttpServletRequest來完成它的工作。 這是Dropwizard項目的一部分,該模式基於Dropwizard的AuthDynamicFeatureAuthFilter,但經過修改以支持注入。

所以我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM