Расширение JBoss EAP 7.1 Spring-Data-JPA CDI

У нас есть приложение, которое использует репозитории 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 ;
    }

person Cary    schedule 08.08.2018    source источник


Ответы (2)


Решением моей проблемы было два небольших изменения:

  • Добавьте @ApplicationScoped в класс производителя. По-видимому, WELD больше не видит аннотации @Producer и обрабатывает класс производителя без этого (я думаю), потому что областью действия по умолчанию является @Dependent.
  • Удалите @PersistenceContext и параметр из метода производителя createEntityManager(...), вместо этого ссылаясь на entityManagerFactory. Странно, что это даже работало с более ранней версией, поскольку @PersistenceContext «Выражает зависимость от EntityManager, управляемого контейнером ...», о чем лаял новый WELD, поскольку параметр был EntityManagerFactory.

Мой класс производителя:

import javax.enterprise.context.ApplicationScoped ;
import javax.enterprise.context.Dependent ;
import javax.enterprise.context.RequestScoped ;
import javax.enterprise.inject.Disposes ;
import javax.enterprise.inject.Produces ;
import javax.persistence.EntityManager ;
import javax.persistence.EntityManagerFactory ;
import javax.persistence.PersistenceUnit ;


@ApplicationScoped
public class CdiConfig
{
    /*
     * Entity Manager Factory
     */
    @Produces
    @Dependent
    @PersistenceUnit(unitName = "stafftrack_data_access")
    private EntityManagerFactory entityManagerFactory ;


    /*
     * Entity Manager
     */
    @Produces
    @RequestScoped
    public EntityManager createEntityManager( )
    {
        EntityManager em = entityManagerFactory.createEntityManager() ;
        return em ;
    }


    public void close( @Disposes EntityManager entityManager )
    {
        entityManager.close() ;
    }
}
person Cary    schedule 23.08.2018
comment
Привет, Кэри, не могли бы вы поделиться полным примером, как вы создаете EntityManager? Не могу понять. Ваше здоровье - person Kousalik; 26.10.2018

Вы можете попробовать использовать/добавить несколько аннотаций в свой Менеджер объектов, которые могут решить проблему. Пробовали ли вы это:
@Produces
@Dependent
@PersistenceContext
private EntityManager entityManager;
Это может работать с eap 7.1.

person Sweta Patra    schedule 14.08.2018