我正在尝试使用Guice来解决依赖问题。我已经阅读了教程和示例,但我仍然无法弄清楚为什么我一直收到这个错误:
No implementation for com.edit.owl.persistence.PersistentStore<com.edit.common.domain.Foo> annotated with @com.google.inject.name.Named(value=FooPersistence) was bound. while locating com.edit.owl.persistence.PersistentStore<com.edit.common.domain.Foo> annotated with @com.google.inject.name.Named(value=FooPersistence)
for parameter 0 at com.edit.owl.service.FooService.<init>(FooService.java:17)while locating com.edit.owl.service.FooService
for parameter 0 at com.edit.owl.resource.DistributionListResource.<init>(ListResource.java:36)while locating com.edit.owl.resource.ListResource
所以,基本上,代码的结构如下:
实体:foo
•fooService
@Singleton
public class FooService implements PersistentStore<Foo> {
private final PersistentStore<Foo> fooDAO;
@Inject
public FooService (@Named("fooPersistence")PersistentStore<Foo> fooRepository) {
this.fooDAO = fooRepository;
}
@Override
@Transactional
public Foo create(Foo foo) {
return fooDAO .create(foo);
}
@Override
@Transactional
public Foo update(Foo foo) {
return fooDAO.update(foo);
}
@Override
@Transactional
public Foo findById(Long Id) {
return fooDAO.findById(Id);
}
}
•PersistentStore 定义通用数据类型E的创建,更新和删除 •FooResource 调用FooService的客户端应用程序
我已在
中实施了绑定•FooModule
public class FooModuleimplements Module {
public void configure(final Binder binder) {
binder.bind(FooResource.class);
}
}
•PersistenceModule
public class PersistenceModule extends AbstractModule {
private final String persistenceUnit;
public PersistenceModule(String persistenceUnit) {
this.persistenceUnit = persistenceUnit;
}
@Override
protected void configure() {
install(new JpaPersistModule(persistenceUnit));
bind(JpaInitializer.class).asEagerSingleton();
bind(new TypeLiteral<PersistentStore<Foo>>() {
}).to(new TypeLiteral<Foo>() {
});
}
}
如何解决此问题?
答案 0 :(得分:3)
在PersistenceModule中,您可以在不使用注释的情况下绑定PersistenceStore。在FooService的构造函数中,您要求使用@Named注释依赖项(&#34; fooPersistence&#34;)。
使用绑定和注入点中的注释或删除它们。
顺便说一下: 如果你有机会,首选onami仍然存在。它修复了guice中的一些已知错误(已被废弃)。