Как настроить Spring Data JPA с помощью Google Guice - PullRequest
0 голосов
/ 15 февраля 2019

Как правильно настроить 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;
  }
}

EmployeeEntity

@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 Зависимость.

1 Ответ

0 голосов
/ 16 февраля 2019

Хорошо, я наконец-то нашел простой и понятный способ сделать эту работу без какой-либо зависимости:

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);
  }
}

Спасибо

...