CDI项目中的@AroundInvoke

时间:2011-07-14 02:04:40

标签: java interceptor cdi

有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(…);
   }
   …
}    

1 个答案:

答案 0 :(得分:0)

您需要在所有项目中META-INF/beans.xml(打包为.jar)

您不应该自己实例化这些类。如果您这样做,他们不受CDI管理。让CDI实例化它们。例如look here