使用两个接口创建EJB。 @Local Web界面界面和@Remote界面本地app客户端

时间:2011-06-21 01:56:20

标签: jsf java-ee ejb java-ee-6 ejb-3.1

我有一个包含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并在@Local内创建CoreEJBLocal界面调用EJB package?还是会有额外的东西?我希望我的Managed Bean代码像这样

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

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

1 个答案:

答案 0 :(得分:1)

  

我是否只是公开更改CoreEJB   class CoreEJB实现了CoreEJBRemote   到公共类CoreEJB实现   CoreEJBRemote,CoreEJBLocal和创建   @Local接口调用CoreEJBLocal   在EJB包里面?

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