У нас есть приложение, которое использует репозитории Spring Data JPA для внедрения в EJB. Spring org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension
творит чудеса.
Он ищет EntityManager в CDI, сохраняет его для последующего использования, ищет репозитории Spring Data JPA, используя аннотацию @Repository
, и сохраняет их типы для последующего использования. Когда CDI инициализируется, запускается JpaRepositoryExtension::afterBeanDiscovery
и выполняет правильное создание bean-компонента и вставку в CDI. Это отлично работало в JBoss EAP 6.2/6.3/6.4.
JBoss EAP 7.1 построен на WildFly 11, а версия Hibernate теперь 5.1. Код начальной загрузки JPA был реструктурирован в JBoss и поставщике Hibernate JPA. Из-за этой реструктуризации EntityManager не находится в CDI во время выполнения:
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.processBean(ProcessBean<X>)
В итоге это вызывает...
org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(Class<?>, Set<Annotation>, BeanManager)
...бросать:
javax.enterprise.inject.UnsatisfiedResolutionException: невозможно разрешить bean-компонент для 'javax.persistence.EntityManager' с квалификаторами [@javax.enterprise.inject.Default(), @javax.enterprise.inject.Any()]. в org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.createRepositoryBean(JpaRepositoryExtension.java:120) в org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension.afterBeanDiscovery(JpaRepositoryExtension.java:96)
Кто-нибудь успешно развернул Spring Data JPA на JBoss EAP 7.1 или WildFly 11+ и получил репозитории JPA, созданные в CDI?
Изменить: у меня есть CDI Producer, который отлично работает в EAP 6.2/3/4:
@Produces
@Dependent
@PersistenceUnit( unitName="** Our PU Name **" )
private EntityManagerFactory entityManagerFactory;
.
.
.
@Produces
@RequestScoped
@PersistenceContext( type = PersistenceContextType.EXTENDED )
public EntityManager createEntityManager( EntityManagerFactory emf )
{
EntityManager em = emf.createEntityManager();
return em ;
}