如何使用 Google Guice 设置 Spring Data JPA

How to setup Spring Data JPA with Google Guice

如何正确设置 Guice 4.2.2,Spring-Data-JPA 2.1.4.RELEASE?

我目前正在使用 org.springframework.guice.spring-guice 1.1.3.RELEASE 来配置两个项目一起工作,但是我在注入自动生成 CrudRepository.

查看我当前的代码:

EmployeeDalConfiguration

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
@GuiceModule(includeFilters = @Filter(type = FilterType.REGEX, pattern=".*\.Repository"))
public class EmployeeDalConfiguration {
  @Bean
  public DataSource dataSource() {

    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("com.allierh.webservice.modules.employee.dal.entity");
    factory.setDataSource(dataSource());
    return factory;
  }

  @Bean
  public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory);
    return txManager;
  }
}

雇员实体

@Entity
public class EmployeeEntity {

  @Id
  String id;

  String firstName;

  String lastName;

  public EmployeeEntity() {}
}

EmployeeEntityDao

interface EmployeeEntityDao extends CrudRepository<EmployeeEntity, String> {}

EmployeeDalModule

public class EmployeeDalModule extends AbstractModule {

  @Override
  protected void configure() {
    install(new SpringModule(BeanFactoryProvider.from(EmployeeDalConfiguration.class)));
    bind(EmployeeRepository.class).to(PostgreEmployeeRepository.class);
  }
}

EmployeeRepository

public class EmployeeRepository implements EmployeeRepository {

  private final EmployeeEntityDao dao;

  @Inject
  public EmployeeRepository(EmployeeEntityDao dao) {
    this.dao = dao;
  }
}

有了这一切,Guice 在运行时抛出一个错误,说它找不到 EmployeeEntityDao 的实现。这是完整的堆栈:

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

1) No implementation for com.foo.webservice.modules.employee.dal.EmployeeEntityDao was bound.
  while locating com.foo.webservice.modules.employee.dal.EmployeeEntityDao
    for the 1st parameter of com.foo.webservice.modules.employee.dal.EmployeeRepository.<init>(EmployeeRepository.java:15)
  at com.foo.webservice.modules.employee.dal.EmployeeDalModule.configure(EmployeeDalModule.java:12) (via modules: com.foo.webservice.modules.employee.api.EmployeeModule -> com.foo.webservice.modules.employee.dal.EmployeeDalModule)

最后,我只是想让 Guice 注入引导的 Spring Data JPA 存储库,有或没有spring-guice依赖。

好的,我终于想出了一个干净简单的方法来完成这项工作并且没有任何依赖性:

public class EmployeeDalModule extends AbstractModule {

  @Override
  protected void configure() {
    ListableBeanFactory beanFactory = new AnnotationConfigApplicationContext(EmployeeDalConfiguration.class).getBeanFactory();
    bind(EmployeeEntityDao.class).toInstance(beanFactory.getBean(EmployeeEntityDao.class));
    bind(EmployeeRepository.class).to(EmployeeRepositoryImpl.class);
  }
}

谢谢