如何使用 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);
}
}
谢谢
如何正确设置 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);
}
}
谢谢