簡體   English   中英

JerseyTest不滿意依賴(依賴注入)

[英]JerseyTest unsatisfied dependency (Dependency Injection)

我需要測試我的RESTful服務,我認為最合適的方法是使用Jersey測試框架,因為我已經在使用Jersey來提供服務。

但是,當運行一個簡單的測試時,我得到一個UnsatisfiedDependencyException因為找不到我在服務中使用的DAO的實現(它是通過DI設置的)。 每次修改我的pom.xml Maven配置文件時,這個錯誤都會發生在我身上,主要是在添加或刪除依賴項時。 據說,我正在使用的IDE,IntelliJ IDEA應該自動重新生成工件,但是為了避免這種依賴性故障,我需要從Tomcat服務器部署選項以及項目結構中刪除工件,並添加它再次。

這里的問題是測試框架正在使用單獨的服務器,正如文檔所述。 我使用以下一個:

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.23.1</version>
</dependency>

如果我使用不同的服務器,我不知道如何解決依賴問題。

異常堆棧中的頂部錯誤消息說:

org.glassfish.hk2.api.UnsatisfiedDependencyException:SystemInjecteeImpl沒有可用於注入的對象

有任何想法嗎?

編輯。 我設法用一個骯臟的解決方案修補它。

首先,讓我告訴你我是如何注入DAO的:

// Binder.java
public class Binder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(TournamentDao.class).to(ITournamentDao.class).in(Singleton.class);
    }
}

// DependencyInjectionFeature.java
@Provider
public class DependencyInjectionFeature implements Feature {
    @Override
    public boolean configure(FeatureContext context) {
        context.register(new Binder());
        return true;
    }
}

// EventSchedulerService.java
@Path("eventscheduler")
public class EventSchedulerService {
    private ITournamentDao dao;

    @Inject
    public EventSchedulerService(ITournamentDao tournamentDao) {
        dao = tournamentDao;
    }
}

Web配置文件web.xml掃描放置這些類的包(該包與測試所在的包的名稱相同),並執行依賴注入,因為它找到了@Provider注釋。

為了修補我的問題,我在測試類中完成了同樣的事情:

public class EventSchedulerServiceTest extends JerseyTest {
    protected Application configure() {
        ResourceConfig config = new ResourceConfig(EventSchedulerService.class);
        config.register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(TournamentDao.class).to(ITournamentDao.class).in(Singleton.class);
            }
        });
        return config;
    }
}

顯然這是一個壞主意,因為現在我有重復的代碼; 但它做到了伎倆。 我想知道如何使測試服務器正確使用服務配置。

我記得在此處的評論中的前一個討論 ,您遇到了不使用ResourceConfig配置主應用程序的問題。 我們改為使用web.xml。

您使用使用@Provider注釋的Feature的原因是您在web.xml中使用包掃描

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>your.packages.to.scan</param-value>
</init-param>

包掃描在Feature上拾取了@Provider ,並自動注冊它。 此提供程序用於注冊Binder ,這是配置依賴項注入的內容。

如上所述,可以在ResourceConfig或web.xml中配置Jersey應用程序。 您可以在web.xml中執行任何球衣配置,也可以在ResourceConfig 您可以使用ResourceConfig注冊組件的方法有很多種

  • 你可以打電話給register

     config.register(new DependencyInjectionFeature()); 
  • 您也可以通過調用packages來打包掃描,就像在web.xml中一樣

     config.packages("your.packages.to.scan"); 
  • 您還應該查看Binder類的實現。 它擴展了AbstractBinder 查看當前如何在測試中配置DI

     config.register(new AbstractBinder() { @Override protected void configure() { ... } }); 

    您正在注冊AbstractBinder實例。 所以你知道調用你可以在ResourceConfig上注冊DI配置調用register ,所以你可以代替注冊一個不同的綁定器,只需注冊一個Binder類的實例

     config.register(new Binder()); 

所以你有一些選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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