Java @CDI项目中的AroundInvoke

Java @CDI项目中的AroundInvoke,java,interceptor,cdi,Java,Interceptor,Cdi,有3个项目使用CDI。项目A有一个用于事务控制的拦截器 项目B使用项目A将数据保存在数据库中。当我运行这些单元测试时,一切都通过了 项目C使用项目B进行集成测试。当它从拦截器中找到@AroundInvoke注释时,这些测试失败 出什么事了?拦截器仅在projectbeans.xml中 这个例外并没有让我头脑清醒。它只显示jassist错误。在调试过程中,我发现问题来自boostrap.deploybeans()内部。所以,我在拦截器类中对@AroundInvoke进行了注释,所有测试都进行得很顺

有3个项目使用CDI。项目A有一个用于事务控制的拦截器

项目B使用项目A将数据保存在数据库中。当我运行这些单元测试时,一切都通过了

项目C使用项目B进行集成测试。当它从拦截器中找到@AroundInvoke注释时,这些测试失败

出什么事了?拦截器仅在projectbeans.xml中

这个例外并没有让我头脑清醒。它只显示jassist错误。在调试过程中,我发现问题来自boostrap.deploybeans()内部。所以,我在拦截器类中对@AroundInvoke进行了注释,所有测试都进行得很顺利,但数据库中的insert没有问题。我认为这是因为我删除了为插入创建事务的拦截器

守则:

1) 有一个项目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(…);
   }
   …
}    
/注释/

@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实例化它们。例如。

为什么会失败?它会引发异常吗?是否未返回预期结果?换言之,测试中出现的问题是什么?请从单个帐户发布;如果你有不止一个,它们可以是。