java - Jersey + HK2 : EntityManager injection fails

标签 java jersey hk2

我正在关注this adviceEntityManager 注入(inject)到我的 Jersey + HK2 项目中。由于某种原因,我在启动服务时突然看到这个异常:

Exception in thread "main" java.lang.IllegalArgumentException: Creation of FactoryDescriptors must have Factory as a contract of the first argument at org.glassfish.hk2.utilities.FactoryDescriptorsImpl.(FactoryDescriptorsImpl.java:78) at org.glassfish.hk2.utilities.binding.AbstractBindingBuilder$FactoryTypeBasedBindingBuilder.complete(AbstractBindingBuilder.java:453) at org.glassfish.hk2.utilities.binding.AbstractBinder.resetBuilder(AbstractBinder.java:180) at org.glassfish.hk2.utilities.binding.AbstractBinder.complete(AbstractBinder.java:190) at org.glassfish.hk2.utilities.binding.AbstractBinder.bind(AbstractBinder.java:174) at 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 绑定(bind)工厂:

    ServiceLocatorUtilities.bind(applicationLocator, new AbstractBinder() {

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

有人可以解释一下这个异常吗?

最佳答案

不确定它是否会对任何人有帮助,但我发现了我是如何打破它的:

我正在使用 Maven 阴影插件创建一个阴影 uber-jar。该插件提示类重叠,因此我将以下包排除在阴影之外:

<!-- 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>

我的 friend 们,这不是一个好主意。删除该部分解决了问题。

关于java - Jersey + HK2 : EntityManager injection fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38901159/

相关文章:

security - 使用 jersey 客户端访问安全、 Restful Web 服务

spring - HK2 没有看到 Spring Beans

java - 有没有办法使用 HK2 将实例注入(inject)集合中?

java - HK2中如何将多个接口(interface)收集到一个Collection中?

java - hibernate + Derby : Comparisons between 'BOOLEAN' and 'INTEGER' are not supported

java - 反序列化 Jersey 1 中的 List<Map<String, String>> QueryParam

Java- Jersey ,JAX RS

java - 使用 Swing 创建列表和列表项的操作

java - 检查 Java SE 中表格单元格中的 jcheckbox 是否被选中

java - 如何使用 Java 8 流清除 HashMap 值内列表的内容