具有接口继承时,@ EJB inject不起作用

时间:2018-06-25 16:39:01

标签: ejb wildfly

我有以下代码。

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示例都没有基本接口,该接口被本地和远程接口扩展。有办法使这项工作吗?

1 个答案:

答案 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接口。