CDI错误:尝试注入EntityManager的模糊依赖项

时间:2015-05-08 13:33:02

标签: jboss7.x cdi entitymanager jboss-weld

尝试在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]]]

如您所见,“可能的依赖关系”指向同一EntityManager生成器的两次:br.com.sigga.siot.cdi.JPAProducer.entityManager。该字段声明如下:

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

类似的案例在WELD-001409 Ambiguous dependencies中有关,但我无法将我的应用程序服务器更改为Glassfish 4.1。 : - )

我的开发环境:Eclipse Luna,Java 7,Maven 3.x(eclipse的嵌入式版本)。我有一个Maven项目(siot-mobility)有3个模块(siot-mobility- [ear | ejb | web])。

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>

随时向我询问有关可以帮助您的更多信息。 :-)先谢谢。

1 个答案:

答案 0 :(得分:1)

发现错误: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生成器。