2014-11-04 121 views
1

每当我在我的企业应用程序项目中使用CDI托管的bean时,我得到CDI部署失败:WELD-001408异常。这就是我得到:CDI部署失败:使用CDI bean时的WELD-001408(Glassfish 4.1)

Injection method name must start with "set" 
symbol: javax.persistence.PersistenceUnit 
location: public javax.persistence.EntityManager de.syngenio.backend.beans.Resources.create(javax.persistence.EntityManagerFactory) 

和异常:

Exception during lifecycle processing 
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type EntityManagerFactory with qualifiers @Default 
    at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Produces @ConversationScoped @PersistenceUnit public de.syngenio.backend.beans.Resources.create(EntityManagerFactory) 
    at de.syngenio.backend.beans.Resources.create(Resources.java:0) 

这是类:

public class Resources { 

    @Produces 
    @ConversationScoped 
    @PersistenceUnit(unitName = "mongodb-pu") 
    public EntityManager create(EntityManagerFactory emf) { 
     return emf.createEntityManager(); 
    } 

    public void close(@Disposes EntityManager em) { 
     em.close(); 
    } 
} 

@Inject 
private EntityManager em; 

注入我使用Glassfish 4.1和JDK build 1.8.0_25-b17

编辑:

META-INF/beans.xml文件(EJB项目):

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
      version="1.1" bean-discovery-mode="all"> 
    </beans> 

META-INF/persistence.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
<persistence-unit name="mongodb-pu" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <properties> 
     <property name="eclipselink.target-database" value="org.eclipse.persistence.nosql.adapters.mongo.MongoPlatform"/> 
     <property name="eclipselink.nosql.connection-spec" value="org.eclipse.persistence.nosql.adapters.mongo.MongoConnectionSpec"/> 
     <property name="eclipselink.nosql.property.mongo.port" value="27017"/> 
     <property name="eclipselink.nosql.property.mongo.host" value="localhost"/> 
     <property name="eclipselink.nosql.property.mongo.db" value="webshop"/> 
     <property name="eclipselink.logging.level" value="FINEST"/> 
    </properties> 
</persistence-unit> 
</persistence> 
+0

我认为你在webapp/WEB-INF /文件夹中缺少beans.xml文件。 对于CDI来说,即使空如https://gist.github.com/sejersbol/845053 – rangalo 2014-11-04 19:39:10

+0

其实它在那里。对不起,我错过了写这个。我在EJB项目的META-INF /中有一个beans.xml文件。 <?xml version =“1.0”encoding =“UTF-8”?> ' – mherwig 2014-11-04 19:43:08

+0

您还可以在您声明持久性单元的位置粘贴persistence.xml吗?数据源是用gf创建的吗?是否还有其他与db相关的异常? – rangalo 2014-11-04 19:45:13

回答

0

使用EntityManagerFactory作为一个参数时在托管方法中,您应该确保EntityManagerFactory也是可注射的。由于您的方法“创建”是托管的,所有参数值的创建方式与@Inject类似。我不知道为什么你的EntityManagerFactory不是可注射的,也不知道这是获得它的一个实例的正确方法。我的建议是: 1.在创建方法 中以另一种方式获得您的EntityManagerFactory 2.或者为您的EntityManagerFactory编写一个生产者,创建并返回一个新的EntityManagerFactory