Java CDI部署失败:当使用CDI bean(Glassfish 4.1)时,WELD-001408

Java CDI部署失败:当使用CDI bean(Glassfish 4.1)时,WELD-001408,java,jakarta-ee,glassfish,cdi,weld,Java,Jakarta Ee,Glassfish,Cdi,Weld,每当我在企业应用程序项目中使用CDI托管bean时,就会出现CDI部署失败:WELD-001408异常。这就是我得到的: Injection method name must start with "set" symbol: javax.persistence.PersistenceUnit location: public javax.persistence.EntityManager de.syngenio.backend.beans.Resources.create(javax.per

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

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项目):


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>

org.eclipse.persistence.jpa.PersistenceProvider

在托管方法中使用
EntityManagerFactory
作为参数时,应确保
EntityManagerFactory
也是可注入的。因为您的方法“create”是受管理的,所以所有参数值都是以类似@Inject的方式创建的。我不知道为什么您的
EntityManagerFactory
是不可注入的,也不知道这是否是获取其实例的正确方法。我的建议是: 1.在create方法中以另一种方式获取
EntityManagerFactory

2.或者为您的
EntityManagerFactory
编写一个生产者,创建并返回一个新的
EntityManagerFactory

我想您的webapp/WEB-INF/文件夹中缺少beans.xml文件。为了使CDI工作,即使文件为空,也需要此文件,例如,实际上它就在那里。对不起,我没写好。我在EJB项目的META-INF/中有一个beans.xml
您还可以将persistence.xml粘贴到声明持久性单元的位置吗?数据源是在gf中创建的吗?还有其他与db相关的例外吗?我更新了原始帖子。我使用eclipselink和eclipselink nosql扩展。我将扩展放在glassfish模块文件夹和mongo java驱动程序中。实际上,如果我从一个无状态会话bean中使用entitymanagerfactory创建一个entitymanager实例,那么数据库连接就可以正常工作?
<?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>