繁体   English   中英

使用两个接口创建EJB。 Web模块的@Local接口和本地应用程序客户端的@Remote接口

[英]Create EJB with two interfaces. @Local interface for web module and @Remote interface for local app client

我有一个包含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 CoreEJBRemotepublic class CoreEJB implements CoreEJBRemote, CoreEJBLocal并在EJB package内创建@Local接口调用CoreEJBLocal 还是会有其他东西? 我希望我的Managed Bean代码像这样

@ManagedBean
@RequestScoped
public void testView{
    @EJB
    private CoreEJBLocal coreEJB;

    public void add(Something something){
        coreEJB.add(something); //Local invocation
    }
}

我是否只是将CoreEJB从公共类CoreEJB实现CoreEJBRemote更改为公共类CoreEJB实现CoreEJBRemote,CoreEJBLocal并在EJB包内创建@Local接口调用CoreEJBLocal?

是的,这应该足够了。 你试过了吗? 失败了吗? 请记住,本地接口是按引用传递的,而远程接口是按值传递的。 如果调用者(或bean)使返回值(或分别为参数)的状态发生变化,那么您将在两者之间得到不同的行为。 您必须在API合同中对此进行谨慎处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM