我正在尝试使用显式CDI创建Java EE 7项目 . 该项目由Maven打包为ejb项目 .
尽管Java EE 7不再需要 beans.xml
,但我有一个这样的文件,位于 src/main/resources/META-INF/beans.xml
下,因为我想使用 @Alternatives
进行测试 .
更确切地说,我想在集成测试期间使用H2内存数据库(使用Arquillian和Weld),但对于非本地环境来说,这是一个很好的'postgres .
我的问题:
似乎忽略了 beans.xml
文件 . 测试:
-
当我删除其中一个
@Produces EntityManager
的类时,它按预期工作 . -
当我有两个类,但只有一个注释
@Alternative
时,它使用另一个,无论beans.xml
是什么 . -
当我有两个带有
@Alternative
注释的类时,它失败了
org.jboss.weld.exceptions.DeploymentException:WELD-001408在注入点[[field] @Inject private arquillian.ArquillianTestAbstract.em]中带有限定符[@Default]的[EntityManager]类型的不满意依赖项
我有点期待 beans.xml
在错误的地方或某事,但我搜索得很远(包括在this related question on SO),我找不到我的错误 .
一些文件:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mystuff</groupId>
<artifactId>myparent</artifactId>
<version>${project-version}</version>
</parent>
<artifactId>myproject</artifactId>
<packaging>ejb</packaging>
(snip - various dependencies)
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>${ejb-plugin-version}</version>
<configuration>
<ejbVersion>${ejb-version}</ejbVersion>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin-version}</version>
<configuration>
<argLine>-Dfile.encoding=UTF-8</argLine>
<forkCount>1C</forkCount>
<redirectTestOutputToFile>false</redirectTestOutputToFile>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
src/main/resources/META-INF/beans.xml:
<?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"
bean-discovery-mode="all" version="1.1"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd">
<alternatives>
<class>persistence.TestDatabaseProducer</class>
</alternatives>
</beans>
src/main/java/persistence/DatabaseProducerImpl.java:
@Singleton
@Alternative
public class DatabaseProducerImpl implements DatabaseProducer {
@Produces
@MyDatabase
@Override
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("primary").createEntityManager();
}
}
src/main/java/persistence/TestDatabaseProducer.java:
@Singleton
@Alternative
public class TestDatabaseProducer implements DatabaseProducer {
@Produces
@InternalDatabase
@Override
public EntityManager createEntityManager() {
return Persistence.createEntityManagerFactory("internal").createEntityManager();
}
}
1 回答
最后,我正在寻找错误的方向 .
beans.xml
文件没有任何问题,只是在测试期间没有考虑到它 .This was specific to the testing on Weld through Arquillian ,由于Assets打包并发送到嵌入式容器的方式 .
Arquillian测试的标准做法鼓励使用ShrinkWrap创建部署在Weld上的
JavaArchive
,如果您不要求,ShrinkWrap不会出现beans.xml
.这段代码解决了这个问题:(具体来说,
.addAsManifestResource()
调用)