2016-08-11 84 views
0

我正在关注this advice以将EntityManager注入到我的Jersey + HK2项目中。出于某种原因,我突然启动服务时,看到这个异常:在线程泽西岛+ HK2:EntityManager注入失败

异常“主” java.lang.IllegalArgumentException异常:FactoryDe​​scriptors的创作必须厂作为第一个参数 在org.glassfish合同.hk2.utilities.FactoryDe​​scriptorsImpl。(FactoryDe​​scriptorsImpl.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.b inding.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); 
     } 
    }); 

有人能解释的异常?

回答

1

不知道它永远不会帮助任何人,但我发现我怎么把它弄坏了:

我创建一个阴影尤伯杯罐子使用Maven插件树荫。该插件抱怨重叠类,所以我排除了以下包被遮挡:

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

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