为了账号安全,请及时绑定邮箱和手机立即绑定

Google Guice 注入会员不工作

Google Guice 注入会员不工作

慕的地6264312 2021-07-12 16:14:41
我正在使用 GoogleGuice 作为 DI 创建一个新项目。所以我创建了一个我的 DAO 接口:public interface UserDAO extends DAO<User> {    // Some CRUD methods}和一个实现:public class UserDAOImpl implements UserDAO {     // CRUD Methods implementation}这是我的 ApplicationModule 类:public class ApplicationModule extends AbstractModule {    @Override    protected void configure() {        // Tried swap the order without results        bind(UserDAO.class).in(Singleton.class);        bind(UserDAO.class).to(UserDAOImpl.class);    }}在我的 UserService 上,我尝试这样做:@Injectprivate UserDAO dao;但我的 dao 始终为空。而且,当我调用Guice.createInjector(new ApplicationModule())UserService 构造函数时,我得到了以下堆栈跟踪:Servlet.service() for servlet [Jersey REST Service] in context with path [/simple-rest-application] threw exception [A MultiException has 2 exceptions.  They are:1. com.google.inject.CreationException: Unable to create injector, see the following errors:1) No implementation for br.com.brunots.training.simple_rest_application.dao.UserDAO was bound.  Did you mean?    br.com.brunots.training.simple_rest_application.dao.UserDAO bound  at br.com.brunots.training.simple_rest_application.guice.ApplicationModule.configure(ApplicationModule.java:15)  at br.com.brunots.training.simple_rest_application.guice.ApplicationModule.configure(ApplicationModule.java:14)2) A binding to br.com.brunots.training.simple_rest_application.dao.UserDAO was already configured at br.com.brunots.training.simple_rest_application.guice.ApplicationModule.configure(ApplicationModule.java:15).  at br.com.brunots.training.simple_rest_application.guice.ApplicationModule.configure(ApplicationModule.java:14)有人知道发生了什么吗?我缺少什么?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

基本上你的问题是你试图将一个接口绑定到一个单例而不提供任何实现。然后在你的“答案”中,你实际上做得更好:你提供了一个带有实现的接口,然后你说你的实现是一个单例。但是,您实际上并没有使 成为UserDAO一个有效的单例,因为您为每个UserService.


请尝试以下操作:


ApplicationModule.java


public class ApplicationModule extends AbstractModule {

  @Override protected void configure() {

    bind(UserDAO.class)       // Define UserDAO 

      .to(UserDAOImpl.class)  // as implemented by UserDAOImpl

      .in(Singleton.class);   // and make it a singleton.

  }

}

UserService.java


public class UserService {

  private final UserDAO userDAO;

  @Inject UserService(UserDAO userDAO) { // Actually inject your UserDAO!!

    this.userDAO = userDAO;

  }

}

Main.java


public class Main {

  public static void main(String[] args) {

    Injector injector = Guice.createInjector(new ApplicationModule());

    UserService userService = injector.getInstance(UserService.class);

  }

}


查看完整回答
反对 回复 2021-07-29
?
开满天机

TA贡献1786条经验 获得超13个赞

我发现了一些东西...


如果我将 ApplicationModule 更改为:


public class ApplicationModule extends AbstractModule {


    @Override

    protected void configure() {


        bind(UserDAO.class).to(UserDAOImpl.class);

        bind(UserDAOImpl.class).in(Singleton.class);


    }


}

这不能解决问题......我的 UserDAO 仍然没有被注入,但我可以用Guice.createInjector(new ApplicationModule()). 所以在 UserService 构造函数上,我可以做这样的事情:


public UserService() {

    Injector injector = Guice.createInjector(new ApplicationModule());

    injector.injectMembers(this);

}


查看完整回答
反对 回复 2021-07-29
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信