我有一个包含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。
我是否只需将CoreEJB
从public 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
}
}
答案 0 :(得分:1)
我是否只是公开更改CoreEJB class CoreEJB实现了CoreEJBRemote 到公共类CoreEJB实现 CoreEJBRemote,CoreEJBLocal和创建 @Local接口调用CoreEJBLocal 在EJB包里面?
是的,这应该足够了。你试过了吗?它失败了吗?请记住,本地接口是按引用传递的,远程接口是按值传递的。如果调用者(或bean)在返回值(或分别为参数)上发生变异状态,那么你将在两者之间获得不同的行为。您必须在API合同中谨慎处理。