我有以下代码。
public interface Multiplier {
void multiply();
}
@Local
public interface MultiplierLocal extends Multiplier{
}
@Remote
public interface MultiplierRemote extends Multiplier {
}
@Stateless
public class MultiplierImpl implements MultiplierLocal,MultiplierRemote{
@Override
public void multiply() {
System.out.println(" called multiplier ");
}
}
现在,当我像下面这样将这个EJB注入另一个ejb时,它不起作用。但是当我具有本地接口类型时,它可以工作。
@Stateless
public class AdderImpl implements AdderLocal,AdderRemote {
// This does not work.
@EJB
Multiplier mul;
// This works.
/*@EJB
MultiplierLocal mul;*/
@Override
public void add() {
System.out.println(" Adder Imple called");
mul.multiply();
}
}
我得到的错误是在wildfly13中。
原因: org.jboss.as.server.deployment.DeploymentUnitProcessingException: WFLYEJB0406:找不到接口类型为EJB的 'com.libin.ejb.Multiplier'用于绑定com.libin.ejb.AdderImpl / mul
我看到的所有EJB示例都没有基本接口,该接口被本地和远程接口扩展。有办法使这项工作吗?
答案 0 :(得分:0)
@Remote
接口的想法是定义可以由“远程客户端”调用的所有方法,而@Local
接口可以具有可能仅在同一应用程序内部使用的更多方法。这意味着您的@Local
接口通常会扩展您的@Remote
接口。因此,您的继承层次结构应如下所示:
@Remote
public interface Multiplier {
void multiply();
}
@Local
public interface MultiplierLocal extends Multiplier{
}
@Stateless
public class MultiplierBean implements MultiplierLocal {
@Override
public void multiply() {
System.out.println(" called multiplier ");
}
}
在这种情况下,您可以注入Multiplier
,因为它是有效的EJB接口。
在@Remote
界面上方有一个额外的界面没有多大意义。
此外,您还可以省略MultiplierLocal
接口,因为它不提供任何值,并且EJB规范指出,bean的所有公共方法都是自动本地的。因此,无需指定其他@Local
接口。