[英]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.