JerseyTest不满意依赖(依赖注入)

时间:2016-07-04 12:15:45

标签: java maven intellij-idea junit jersey

我需要测试我的RESTful服务,我认为最合适的方法是使用Jersey Test Framework因为我已经在使用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;
    }
}

显然这是一个坏主意,因为现在我有重复的代码;但它做到了伎俩。我想知道如何让测试服务器正确使用服务配置。

1 个答案:

答案 0 :(得分:0)

我记得之前的讨论in the comments here,您遇到了不使用ResourceConfig来配置主应用程序的问题。我们改为使用web.xml。

您使用Feature注释@Provider的原因是我们在您的web.xml中使用包扫描

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

软件包扫描选中@Provider上的Feature,并自动注册。此提供程序用于注册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个实例。所以你知道调用你可以在register上注册调用ResourceConfig的DI配置,这样你就可以注册一个Binder类的实例而不是注册一个不同的绑定器

    config.register(new Binder());
    

所以你有一些选择。