CDI error: Ambiguous dependencies trying to inject EntityManager

CDI error: Ambiguous dependencies trying to inject EntityManager

我在尝试在 JBoss 7.1.1 应用程序服务器中部署我的 EJB 3.1 应用程序时遇到一个奇怪的错误:WELD-001409 Ambiguous dependencies for type [EntityManager] with qualifiers [@Default] at injection point [[parameter 1] of [constructor] @Inject public br.com.sigga.siot.dao.masterdata.impl.ProfileDAOImpl(EntityManager)]. Possible dependencies [[Resource Producer Field [EntityManager] with qualifiers [@Any @Default] declared as [[field] @PersistenceContext @Produces private br.com.sigga.siot.cdi.JPAProducer.entityManager], Resource Producer Field [EntityManager] with qualifiers [@Any @Default] declared as [[field] @PersistenceContext @Produces private br.com.sigga.siot.cdi.JPAProducer.entityManager]]]

如您所见,"possible dependencies" 两次指向同一个 EntityManager 生产者:br.com.sigga.siot.cdi.JPAProducer.entityManager。该字段声明如下:

@PersistenceContext(unitName = "siotMobility")
@Produces
private EntityManager entityManager;

中有一个类似的案例,但我无法将我的应用程序服务器更改为 Glassfish 4.1。 :-)

我的开发环境:Eclipse Luna,Java7,Maven3.x(eclipse的内嵌版)。我有一个包含 3 个模块 (siot-mobility-[ear|ejb|web]) 的 Maven 项目 (siot-mobility)。

EAR 模块的 POM 声明了以下依赖项:

<dependencies>
    <dependency>
        <groupId>br.com.sigga</groupId>
        <artifactId>siot-mobility-web</artifactId>
        <version>${project.version}</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>br.com.sigga</groupId>
        <artifactId>siot-mobility-ejb</artifactId>
        <version>${project.version}</version>
        <type>ejb</type>
    </dependency>
</dependencies>

Maven EAR 插件配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <configuration>
        <version>6</version>
        <defaultLibBundleDir>lib</defaultLibBundleDir>
        <modules>
            <webModule>
                <groupId>br.com.sigga</groupId>
                <artifactId>siot-mobility-web</artifactId>
            </webModule>
            <ejbModule>
                <groupId>br.com.sigga</groupId>
                <artifactId>siot-mobility-ejb</artifactId>
            </ejbModule>
        </modules>
    </configuration>
</plugin>

如有更多信息可以帮助您,请随时向我询问。 :-) 提前致谢。

发现错误:EJB 模块在生成的 EAR 中出现两次,一次在 EAR 文件的根路径中,第二次在 WAR 文件的 WEB-INF/lib 文件夹中。

我更改了 WAR 项目的 POM 文件中的依赖声明:

<dependency>
    <groupId>br.com.sigga</groupId>
    <artifactId>siot-mobility-ejb</artifactId>
</dependency>

至:

<dependency>
    <groupId>br.com.sigga</groupId>
    <artifactId>siot-mobility-ejb</artifactId>
    <scope>provided</scope>
</dependency>

这样,EJB 模块就不会复制到 WAR 文件的 WEB-INF/lib 文件夹中,并且我在生成的 EAR 文件中只有一个 EntityManager 生产者。