2016-08-11 90 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> 

這,我的朋友,不是一個好主意。刪除該部分解決了問題。