【问题标题】:Jersey + HK2: EntityManager injection failsJersey + HK2:EntityManager 注入失败
【发布时间】:2016-08-11 15:59:11
【问题描述】:

我正在关注this advice,以便将EntityManager 注入我的 Jersey + HK2 项目中。不知为何,在启动服务的时候突然看到这个异常:

线程“main”java.lang.IllegalArgumentException 中的异常:FactoryDe​​scriptors 的创建必须将 Factory 作为第一个参数的协定 在 org.glassfish.hk2.utilities.FactoryDe​​scriptorsImpl.(FactoryDe​​scriptorsImpl.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);
        }
    });

谁能解释一下这个异常?

【问题讨论】:

    标签: java jersey hk2


    【解决方案1】:

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

    我正在使用 maven shade 插件创建一个着色的 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>
    

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

    【讨论】:

      猜你喜欢
      • 2013-10-05
      • 1970-01-01
      • 2014-12-01
      • 2012-03-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多