使用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实现接口,即使它是从抽象实现中隐式定义的。我错过了什么或者这是一个限制吗?
答案 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包含在要应用的接口的公开视图集中。