奇怪的EJB行为或我错过了什么?

时间:2012-01-22 09:11:28

标签: java ejb javabeans java-ee-6

使用EJB bean这是一个非常奇怪的行为:

@Local
public interface Provider {
    void test();
}

@Local
public interface ExtProvider extends Provider {
   void test2();
}

public abstract class AbstractProvider implements Provider {
   @Override 
   void test(){ System.out.println("Hello strange " + getTech()); }
   protected abstract String getTech();          
}

public abstract class ExtAbstractProvider extends AbstractProvider implements ExtProvider {
   @Override
   void test2() { System.out.println("Hello from " + getName());}
   @Override
   String getTech() { return "extended EJB";}
   protected abstract String getName();
}
@Stateless
public class ProviderBean extends AbstractProvider {
   @Override
   protected String getTech() { return "EJB";}
}

@Stateless
public class ExtProviderBean extends ExtAbstractProvider {
  @Override
  protected String getName() { return "ext provider";}
}

根据上面的代码,如果我写:

@EJB Provider provider; // should inject an instance of ProviderBean
@EJB ExtProvider extProvider; // should inject an instance of ExtProviderBean

但两个作品中没有一个!!!有人会说,在这个例子中,EJB不知道每次创建哪个实例,因为有两个实例实现Provider。奇怪的是:它只有在我们将两个bean声明为:

时才有效
public class ExtProviderBean extends ExtAbstractProvider implements ExtProvider
public class ProviderBean extends AbstractProvider implements Provider

在这种情况下代码可以正常工作。问题是我们必须明确定义实现bean实现接口,即使它是从抽象实现中隐式定义的。我错过了什么或者这是一个限制吗?

1 个答案:

答案 0 :(得分:0)

我只是阅读了this SO question,我认为所提供的答案也适用于您的案例。

我只是引用了答案的一部分,从而引用了EE规范:

@Stateless
public class A implements Foo { ... }

@Stateless
public class B extends A implements Bar { ... }
  

假设Foo和Bar是本地业务接口而没有   关联的部署描述符,会话bean A公开本地   业务接口Foo和会话bean B公开本地业务   接口栏,但不是Foo。会话bean B需要显式   将Foo包含在要应用的接口的公开视图集中。