Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Guice和DAO模式进行依赖注入_Java_Generics_Types_Guice_Dao - Fatal编程技术网

Java 使用Guice和DAO模式进行依赖注入

Java 使用Guice和DAO模式进行依赖注入,java,generics,types,guice,dao,Java,Generics,Types,Guice,Dao,对于我正在进行的一个小型项目,我一直在尝试为我与DB的交互实现某种DAO模式,并开始使用Guice(这是我第一次)为我处理DI。现在我有了这个类层次结构: DAOImpl引用一个类类型,这样我的数据库客户端(mongo/morphia)就可以进行一些初始化工作,并实例化morphia提供的BasicDAO。以下是相关类的片段: public class DAOImpl<T> implements DAO<T> { private static final Logge

对于我正在进行的一个小型项目,我一直在尝试为我与DB的交互实现某种DAO模式,并开始使用Guice(这是我第一次)为我处理DI。现在我有了这个类层次结构:

DAOImpl
引用一个类类型,这样我的数据库客户端(mongo/morphia)就可以进行一些初始化工作,并实例化morphia提供的
BasicDAO
。以下是相关类的片段:

public class DAOImpl<T> implements DAO<T> {
  private static final Logger LOG = LoggerFactory.getLogger(DAOImpl.class);
  private static final String ID_KEY = "id";
  private final org.mongodb.morphia.dao.DAO morphiaDAO;

  @Inject
  public DAOImpl(Datastore ds, Class<T> resourceClass) {
    morphiaDAO = new BasicDAO(resourceClass, ds);

    LOG.info("ensuring mongodb indexes for {}", resourceClass);
    morphiaDAO.getDatastore().ensureIndexes(resourceClass);
  }
}

public class UserDAO extends DAOImpl<User> {
  @Inject
  public UserDAO(Datastore ds) {
    super(ds, User.class);
  }

  public User findByEmail(String email) {
    return findOne("email", email);
  }
}
以下是我看到的一些错误:

com.google.inject.CreationException: Unable to create injector, see the following errors:

1) No implementation for org.mongodb.morphia.Datastore was bound.
  while locating org.mongodb.morphia.Datastore
    for the 1st parameter of com.wellpass.api.dao.UserDAO.<init>(UserDAO.java:12)
  at com.wellpass._inject.AppInjector.configure(AppInjector.java:18)

2) java.lang.Class<T> cannot be used as a key; It is not fully specified.
  at com.wellpass.api.dao.DAOImpl.<init>(DAOImpl.java:19)
  at com.wellpass._inject.AppInjector.configure(AppInjector.java:14)
com.google.inject.CreationException:无法创建注入器,请参阅以下错误:
1) 未绑定org.mongodb.morphia.Datastore的任何实现。
查找org.mongodb.morphia.Datastore时
用于com.wellpass.api.dao.UserDAO的第一个参数。(UserDAO.java:12)
在com.wellpass.\u inject.AppInjector.configure(AppInjector.java:18)上
2) java.lang.Class不能用作密钥;它没有完全指定。
位于com.wellpass.api.dao.DAOImpl.(DAOImpl.java:19)
在com.wellpass.\u inject.AppInjector.configure(AppInjector.java:14)上

如果您需要以下注射部位,将不胜感激。

public class AppInjector extends AbstractModule {
  @Override
  protected void configure() {
    bind(com.wellpass.api.dao.DAO.class).to(DAOImpl.class);

//    bind(new TypeLiteral<SomeInterface<String>>(){}).to(SomeImplementation.class);
//    bind(new TypeLiteral<MyGenericInterface<T>>() {}).to(new TypeLiteral<MyGenericClass<T>>() {});
//    bind(new TypeLiteral<DAO<User>>() {}).to(UserDAO.class);

    bind(new TypeLiteral<DAO<User>>(){}).to(new TypeLiteral<DAOImpl<User>>() {});
  }
}
@Inject
public DAOConsumer(DAO<User> dao) {
}
是的

至于你的其他错误:

1) 未绑定org.mongodb.morphia.Datastore的任何实现

这是因为
数据存储
是一个接口。您需要将接口绑定到实现、实例或
提供程序

要了解如何做到这一点,请考虑在不增加Guice复杂性的情况下手动执行此操作所需的步骤。一旦您100%理解了这一点,您就可以尝试设计一个对象图,适当地反映morphia初始化中的步骤

为了让您开始,有一个关于如何获取
数据存储
对象实例的指南:

final Morphia morphia = new Morphia();

// tell Morphia where to find your classes
// can be called multiple times with different packages or classes
morphia.mapPackage("org.mongodb.morphia.example");

// create the Datastore connecting to the default port on the local host
final Datastore datastore = morphia.createDatastore(new MongoClient(), "morphia_example");
datastore.ensureIndexes();
从他们的代码中,您可以看到获取
数据存储所需的依赖项至少有两个:

  • 一个独生子
    Morphia
  • 单例
    MongoClient

  • 您必须编写一些代码来设置它,可能需要使用Guice的
    提供程序
    类。

    嘿,我只是想回过头来说声谢谢。我以老式的方式开始自己手动注射deps,然后一步一步地找到解决方案。你关于
    TypeLiteral
    的回答让我基本上明白了这一点,但由于我的
    DAO
    是一个由
    DAOImpl实现的接口,因此,
    bind(new-TypeLiteral(){}).to(UserDAO.class);绑定(new-TypeLiteral(){}).to(PersonDAO.class);绑定(Mongo.class).to(MongoClient.class)
    对于
    数据存储
    ,我最终创建了一个您建议的提供者,并使用
    @Singleton
    注释:
    @Provides@Singleton public Datastore datastoreProvider(MongoClient MongoClient,ServerConfig config){Morphia Morphia=new Morphia();return Morphia.createDatastore(mongoClient,config.getMongoConfig().getDatabase());}
    @Justin我真的很高兴它能帮上忙-祝你的应用程序其余部分好运!
    final Morphia morphia = new Morphia();
    
    // tell Morphia where to find your classes
    // can be called multiple times with different packages or classes
    morphia.mapPackage("org.mongodb.morphia.example");
    
    // create the Datastore connecting to the default port on the local host
    final Datastore datastore = morphia.createDatastore(new MongoClient(), "morphia_example");
    datastore.ensureIndexes();