【发布时间】:2016-04-08 12:54:07
【问题描述】:
我有一个 Jersey 资源,其中注入了外观对象。这是在我的ResourceConfig 中配置的,并且外观可以很好地注入。外观包含一个 DAO 类,它也应该被注入并配置在相同的ResourceConfig 中。现在我的问题; DAO 类为空。因此,没有注入。
@ApplicationPath("/service")
public class SystemSetup extends ResourceConfig {
public SystemSetup() {
packages(false, "com.foo.bar");
packages("org.glassfish.jersey.jackson");
register(JacksonFeature.class);
final LockManager manager = getLockManager();
final SessionFactory sessionFactory = getSessionFactory();
register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(InjectFactory.getDaoFactory(sessionFactory)).to(Dao.class).in(Singleton.class);
bindFactory(InjectFactory.getFacadeFactory(manager)).to(Facade.class).in(Singleton.class);
}
});
}
@Path("/")
@Produces("text/json")
public class ViewResource {
@Inject
private Facade logic;
public class Facade {
@Inject
private Dao dao; //Not injected
工厂实例相当简单。他们只需调用构造函数并将参数传递给它。
奇怪的是,当我使用 bind(Class object) 而不是 bindFactory 时,这绝对可以正常工作。
编辑
工厂
class InjectFactory {
static Factory<Dao> getDaoFactory() {
return new Factory<Dao>() {
@Override
public Dao provide() {
return new Dao(new Object());
}
@Override
public void dispose(Dao dao) {}
};
}
static Factory<Facade> getFacadeFactory() {
return new Factory<Facade>() {
@Override
public Facade provide() {
return new Facade();
}
@Override
public void dispose(Facade facade) {}
};
}
}
【问题讨论】:
-
你能贴出重现问题所需的所有代码吗?
-
嗨!我创建了一个非常基本的小项目来重现这个问题。请在 speedy.sh/qbsnJ/Dummy-Project.zip 下载它并使用“mvn clean install tomcat7:run-war”运行它并在浏览器中导航到 localhost:9090/dummy/service/test。
-
基本上,您只需要复制一个带有注入字段(A)的对象。对象 A 应包含另一个注入字段 (B)。 A 和 B 都注册为 bindFactory(Factory instance)。
标签: java dependency-injection jersey inject hk2