Java @CDI项目中的AroundInvoke
有3个项目使用CDI。项目A有一个用于事务控制的拦截器 项目B使用项目A将数据保存在数据库中。当我运行这些单元测试时,一切都通过了 项目C使用项目B进行集成测试。当它从拦截器中找到@AroundInvoke注释时,这些测试失败 出什么事了?拦截器仅在projectbeans.xml中 这个例外并没有让我头脑清醒。它只显示jassist错误。在调试过程中,我发现问题来自boostrap.deploybeans()内部。所以,我在拦截器类中对@AroundInvoke进行了注释,所有测试都进行得很顺利,但数据库中的insert没有问题。我认为这是因为我删除了为插入创建事务的拦截器 守则: 1) 有一个项目a,它定义了一个注释和该注释的拦截器。例如:Java @CDI项目中的AroundInvoke,java,interceptor,cdi,Java,Interceptor,Cdi,有3个项目使用CDI。项目A有一个用于事务控制的拦截器 项目B使用项目A将数据保存在数据库中。当我运行这些单元测试时,一切都通过了 项目C使用项目B进行集成测试。当它从拦截器中找到@AroundInvoke注释时,这些测试失败 出什么事了?拦截器仅在projectbeans.xml中 这个例外并没有让我头脑清醒。它只显示jassist错误。在调试过程中,我发现问题来自boostrap.deploybeans()内部。所以,我在拦截器类中对@AroundInvoke进行了注释,所有测试都进行得很顺
public class ProjectBClass {
…
@Transactional
public void interceptorMethod() {
…
}
…
}
<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>
public class ProjectCClass {
…
private ProjectBClass projectBClass;
…
public void testerMethod() {
…
this.projectBClass.interceptorMethod();
…
}
…
}
public class ProjectCClassTest {
…
@Test
public void test() {
ProjectCClass projectCClass = new ProjectCClass();
projectCClass.testerMethod();
…
Assert.assertEquals(…);
}
…
}
/注释/
@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() {
…
}
…
}
<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>
public class ProjectCClass {
…
private ProjectBClass projectBClass;
…
public void testerMethod() {
…
this.projectBClass.interceptorMethod();
…
}
…
}
public class ProjectCClassTest {
…
@Test
public void test() {
ProjectCClass projectCClass = new ProjectCClass();
projectCClass.testerMethod();
…
Assert.assertEquals(…);
}
…
}
所以我认为这个项目必须有一个/META-INF/beans.xml来启用拦截器。例如:
public class ProjectBClass {
…
@Transactional
public void interceptorMethod() {
…
}
…
}
<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>
public class ProjectCClass {
…
private ProjectBClass projectBClass;
…
public void testerMethod() {
…
this.projectBClass.interceptorMethod();
…
}
…
}
public class ProjectCClassTest {
…
@Test
public void test() {
ProjectCClass projectCClass = new ProjectCClass();
projectCClass.testerMethod();
…
Assert.assertEquals(…);
}
…
}
我不确定它是否必须有/META-INF/beans.xml
4) 在同一个项目中,有一个测试方法的集成测试。例如:
public class ProjectBClass {
…
@Transactional
public void interceptorMethod() {
…
}
…
}
<beans>
<interceptors>
<class>br.com.company.projecta.TransactionalInterceptor</class>
</interceptors>
</beans>
public class ProjectCClass {
…
private ProjectBClass projectBClass;
…
public void testerMethod() {
…
this.projectBClass.interceptorMethod();
…
}
…
}
public class ProjectCClassTest {
…
@Test
public void test() {
ProjectCClass projectCClass = new ProjectCClass();
projectCClass.testerMethod();
…
Assert.assertEquals(…);
}
…
}
在所有项目中都需要
META-INF/beans.xml
(打包为.jar)
您不应该自己实例化这些类。如果您这样做,则它们不是CDI管理的。让CDI实例化它们。例如。为什么会失败?它会引发异常吗?是否未返回预期结果?换言之,测试中出现的问题是什么?请从单个帐户发布;如果你有不止一个,它们可以是。