从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,如果这会对答案产生影响。
答案 0 :(得分:1)
EJB 3.1规范的第15.4节强调了两个主要区别:
java:comp
)。通常,每个EJB都有自己的组件名称空间。这样可以更容易地共享引用名称和绑定(尽管这可以在EE 6中使用java:module
或java:app
显式地完成),但它会增加大型WAR中发生冲突的可能性。如果要将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是不可取的。