从WAR运行EJB与单独的EJB容器之间的区别

时间:2014-04-04 10:22:15

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

从WAR与EJB容器定义/运行EJB时,EJB的功能是否有任何差异?决定一种方法与其他方法相比有哪些好处与缺点。

从WAR访问它时我们会失去什么功能?

在我们的例子中,开发人员希望使用EJB来创建/访问REST Web服务。

我们的一位建筑师在下面提到过。因此,他希望有一个单独的EJB(可以将其添加到EAR),也可以添加到WAR,以便将其用作REST端点。我宁愿不在多个地方拥有它

I’d prefer our approach to put transaction/service based code in EJBs to 
leverage Container Managed Transactions, JPA, MDB and all the good stuff EJBs 
have to offer.

从我读过的关于使用EJB作为REST服务实现的文档中,它说

Add the EJB class to the WEB-INF/classes directory of your WAR file or to a 
JAR that is located in your WEB-INF/lib directory. When a client makes a request 
to a JAX-RS annotated enterprise bean, the JAX-RS runtime environment looks up 
and uses an EJB instance of the class to invoke the resource method.

所以,我想知道,如果我们将EJB放在WAR中 - 就像在WAR的源中创建源一样,以便在构建WAR时将类添加到WEB-INF / classes,而不是根据它的用途将相同的ejb jar放在两个不同的地方 - 作为REST Web服务端点与其他功能相比,它是否满足所有要求,或者我必须将jar放在两个地方?

我正在使用带有EJB 3.1的Websphere 8.5,如果这会对答案产生影响。

2 个答案:

答案 0 :(得分:1)

EJB 3.1规范的第15.4节强调了两个主要区别:

  1. WAR中的所有EJB与WAR以及WAR中的所有其他EJB共享组件名称空间(java:comp)。通常,每个EJB都有自己的组件名称空间。这样可以更容易地共享引用名称和绑定(尽管这可以在EE 6中使用java:modulejava:app显式地完成),但它会增加大型WAR中发生冲突的可能性。
  2. EJB类由WAR类加载器加载。在实践中,这并不重要,如果遇到类加载问题,只需注意一些事项。
  3. 如果要将EJB用作REST服务,则必须将EJB打包在WAR中。如果你担心"重复" WAR内部的EJB逻辑和EJB模块,您可以在EJB模块中声明基类,然后在扩展基类的WAR和EJB模块中声明子类,并注释@Stateless或{{1} }。

答案 1 :(得分:0)

关于EJB功能,在WAR或EJB模块中打包EJB之间没有区别。

在某些情况下,您必须在WAR中打包EJB,例如如果你有一个REST端点,它同时是一个EJB。

大多数情况下,WAR会封装前端功能。在这些情况下,从设计的角度来看,将EJB放入WAR是不可取的。