创建具有两个接口的EJB@web模块的本地接口和本地应用程序客户端的@Remote接口



我有一个包含web模块和EJB的EAR包。EJB当前通过Remote接口向本地应用程序客户端公开其包含

@Stateless
public class CoreEJB implements CoreEJBRemote {
    @PersistenceContext(unitName = "CoreWeb-ejbPU")
    private EntityManager em;
    @Override
    public void packageProcess(String configFileName) throws Exception {
        //Process logics
    }
    @Override
    public <T> T create(T t) {
        em.persist(t);
        return t;
    }
    @Override
    public <T> T find(Class<T> type, Object id) {
        return em.find(type, id);
    }
    ...
}

Remote接口不在EAR中,看起来像这个

@Remote
public interface CoreEJBRemote {
    public void packageProcess(java.lang.String configFileName) throws java.lang.Exception;
    public <T extends java.lang.Object> T create(T t);
    public <T extends java.lang.Object> T find(java.lang.Class<T> type, java.lang.Object id);
}

应用程序客户端的Main低于

public class Main {
    @EJB
    private static CoreEJBRemote coreEJB;
    public static void main(String[] args) {
        coreEJB.packageProcess("path/to/a/file");
    }
}

现在,我想为EJB创建一个Local接口,以便在web模块的Managed Bean中,我可以通过本地调用访问EJB。

我是否只是将CoreEJBpublic class CoreEJB implements CoreEJBRemote更改为public class CoreEJB implements CoreEJBRemote, CoreEJBLocal,并在EJB package内创建@Local接口调用CoreEJBLocal?或者会有额外的东西吗?我希望我的托管Bean代码像这样

@ManagedBean
@RequestScoped
public void testView{
    @EJB
    private CoreEJBLocal coreEJB;
    public void add(Something something){
        coreEJB.add(something); //Local invocation
    }
}

我只是将CoreEJB从public更改为类CoreEJB实现CoreEJB远程到公共类CoreEJB实现CoreEJB远程、CoreEJB本地和创建@本地接口调用CoreJBLocalEJB包内部?

是的,这应该足够了。你试过了吗?它失败了吗?请记住,本地接口是通过引用传递的,远程接口是通过值传递的。如果调用者(或bean)在返回值(或参数)上改变状态,那么您将在两者之间获得不同的行为。您必须在API合同中谨慎管理这一点。

最新更新