Джерси + HK2: инъекция EntityManager не удалась

Я следую этому совету, чтобы ввести EntityManager в мой проект Jersey + HK2. По какой-то причине я внезапно вижу это исключение при запуске службы:

Исключение в потоке "main" java.lang.IllegalArgumentException: создание FactoryDescriptors должно иметь Factory в качестве контракта первого аргумента в org.glassfish.hk2.utilities.FactoryDescriptorsImpl.(FactoryDescriptorsImpl.java:78) в org.glassfish.hk2. utilities.binding.AbstractBindingBuilder$FactoryTypeBasedBindingBuilder.complete(AbstractBindingBuilder.java:453) в org.glassfish.hk2.utilities.binding.AbstractBinder.resetBuilder(AbstractBinder.java:180) в org.glassfish.hk2.utilities.binding.AbstractBinder. Complete(AbstractBinder.java:190) в org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:174) в org.glassfish.hk2.utilities.ServiceLocatorUtilities.bind(ServiceLocatorUtilities.java:187) .. ..

Вот мой код:

EMFFactory

public class EMFFactory implements Factory<EntityManagerFactory> {
    private final Logger log = LoggerFactory.getLogger(EMFFactory.class);
    protected EntityManagerFactory emf;

    @Inject
    Config config;

    @PostConstruct
    public void setup() {
        Properties p = new Properties();
        p.put("javax.persistence.jdbc.url", config.getJdbcUrl());
        p.put("javax.persistence.jdbc.user", config.getJdbcUser());
        p.put("javax.persistence.jdbc.password", config.getJdbcPassword());
        emf = Persistence.createEntityManagerFactory("skp-server-PU", p);
        log.debug("JDBC URL: "+ config.getJdbcUrl());
    }

    @Override
    public EntityManagerFactory provide() {
        return emf;
    }

    @Override
    public void dispose(EntityManagerFactory instance) {}

}

EMFactory

public class EMFactory implements Factory<EntityManager> {
    private final Logger log = LoggerFactory.getLogger(EMFFactory.class);
    private EntityManager em;

    @Inject
    EntityManagerFactory emf;

    @PostConstruct
    public void setup() {
        em = emf.createEntityManager();
        log.debug("New EntityManager created");
    }

    @Override
    public EntityManager provide() {
        return em;
    }

    @Override
    public void dispose(EntityManager instance) {
        log.debug("Disposing of EntityManager");
    }

}

ApplicationConfig связывает фабрики:

    ServiceLocatorUtilities.bind(applicationLocator, new AbstractBinder() {

        @Override
        protected void configure() {
            bindFactory(EMFFactory.class)
                    .to(EntityManagerFactory.class)
                    .in(Singleton.class);
            bindFactory(EMFactory.class)
                    .to(EntityManager.class);
        }
    });

Может ли кто-нибудь объяснить исключение?


person Hank    schedule 11.08.2016    source источник


Ответы (1)


Не уверен, что это когда-нибудь поможет кому-нибудь, но я узнал, как я его сломал:

Я создаю затененный uber-jar с помощью плагина maven shadow. Плагин жаловался на перекрывающиеся классы, поэтому я исключил затенение следующего пакета:

<!-- This one comes with epcliselink, but I don't want shaded, hence the scope -->
<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.0</version>
    <scope>provided</scope>
</dependency>

Это, друзья мои, не лучшая идея. Удаление раздела решило проблему.

person Hank    schedule 18.08.2016