有3个项目使用CDI。项目A有一个用于事务控制的拦截器。
项目B使用项目A将数据保存在数据库中。当我运行这些单元测试时,一切都过去了。
Project C使用Project B进行集成测试。当它从Interceptor找到@AroundInvoke注释时,这些测试失败。
出了什么问题?拦截器仅在Project B beans.xml中。
异常堆栈跟踪并没有清除我的想法。它只显示一个jassist错误。调试,我发现问题来自Weld内的boostrap.deploybeans()。所以,我在拦截器类中评论了@AroundInvoke,测试结果一切顺利,但数据库上的插入。我认为这是因为我删除了为插入创建事务的拦截器。
代码:
1)有一个项目A,它定义了这个注释的注释和拦截器。例如:
/注释/
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Transactional {
}
/拦截器/
@Interceptor
@Transactional
public class TransactionalInterceptor implements Serializable {
…
@AroundInvoke
public Object intercept(InvocationContext context) throws Exception {
…
}
…
}
我认为这个项目必须有一个空的/META-INF/beans.xml。
2)还有另一个项目B使用项目A中的拦截器。例如:
public class ProjectBClass {
…
@Transactional
public void interceptorMethod() {
…
}
…
}
所以我认为这个项目必须有一个启用拦截器的/META-INF/beans.xml。例如:
<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>
3)最后,有一个项目C使用项目B中的方法。例如:
public class ProjectCClass {
…
private ProjectBClass projectBClass;
…
public void testerMethod() {
…
this.projectBClass.interceptorMethod();
…
}
…
}
我不确定它是否必须有/META-INF/beans.xml。
4)在同一个项目中,有一个测试方法的集成测试。例如:
public class ProjectCClassTest {
…
@Test
public void test() {
ProjectCClass projectCClass = new ProjectCClass();
projectCClass.testerMethod();
…
Assert.assertEquals(…);
}
…
}
答案 0 :(得分:0)
您需要在所有项目中META-INF/beans.xml
(打包为.jar)
您不应该自己实例化这些类。如果您这样做,他们不受CDI管理。让CDI实例化它们。例如look here。