CDI 1.0 / JEE6中超级方法的拦截器

时间:2014-08-10 09:02:19

标签: jboss7.x cdi interceptor

在以下情况中,

public class Base {

    @Transactional
    public void doSave() {
       // ...
    }

 }

 public class Inherited extends Base {

     public void someMethod() {
         super.doSave();
     }

     @Override
     public void doSave() {
         super.doSave();
     }

 }

如果我将@Transactional注释添加到Inherited.someMethod,则会毫无问题地调用拦截器。

但是,如果没有继承类的注释,拦截器就不会参与Inherited.someMethod()对超类的调用。

此外,调用Inherited.doSave()似乎也没有调用拦截器。我原以为超类上的注释在子类上也是有效的。这不是预期的行为吗?

我正在使用Apache DeltaSpike进行@Transactional注释,而这正在被视为一场战争(在技术上就像是一场战争中的一个罐子)。但是,这可能不相关,因为尝试使用自定义拦截器会显示相同的行为。

这是JBoss EAP 6.3.0 Alpha的相关案例。

1 个答案:

答案 0 :(得分:2)

这是预期的。仅在管理对象时才应用拦截器。当你以这种方式用继承方式编写它时,它不会被应用,因为它不是CDI所知道的调用堆栈的一部分。您需要将Base注入您的课程并致电Base.doSave