本地 EJB 接口和视图之间有什么区别
What is the difference between a Local EJB Interface and View
我认为这个问题是 What is local/remote and no-interface view in EJB?
的延伸
我正在尝试将一组 EJB Jar,其 EJB 由 Servlet 以通用方式调用,从 WebLogic 移植到 JBoss。整个系统很旧,EJB 是 2.0。我试图通过将部署描述符更改为 3.2 来更新它。
这部分相对容易。
这是不存在的部分。
参与这个安排的EJB都实现了SessionBean接口。它们的本地和远程接口是通用的,它们继承自一个通用的业务接口。这是部署描述符的示例:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd">
<module-name>WhizBangSessionEJB</module-name>
<enterprise-beans>
<session>
<ejb-name>WhizBangSessionEJB</ejb-name>
<home>com.whatever.hostinterface.ServiceLogicHome</home>
<remote>com.whatever.hostinterface.ServiceLogic</remote>
<local-home>com.whatever.hostinterface.ServiceLogicLocalHome</local-home>
<local>com.whatever.hostinterface.ServiceLogicLocal</local>
<ejb-class>com.whatever.whizbang.ejbs.WhizBangSessionBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
我还要在这里提到这些接口的签名:
public interface ServiceInterface
{
// business interface methods.
}
public interface ServiceLogic extends EJBObject, ServiceInterface
{}
public interface ServiceLogicLocal extends ServiceLogic, EJBLocalObject
{}
所以一个 ServiceLogic 是一个 ServiceInterface。
一个 ServiceLogicLocal 是一个 ServiceLogic,因此是一个 ServiceInterface
使用远程接口,servlet 能够实例化一个 bean,如下所示:
Object home = ctx.lookup({JNDI of Home Interface});
EJBHome obHome = (EJBHome)PortableRemoteObject.narrow(home, EJBHome.class);
Method m = obHome.getClass().getDeclaredMethod("create", new Class[0]);
sl = (ServiceLogic) m.invoke(obHome, new Object[0]);
而且我有我的 EJB,它可以转换为服务逻辑。
但这些 EJB 和 Servlet 将始终在同一个容器中。因此指示了本地接口。这就是我 运行 遇到麻烦的地方。
在 3.x.
中,本地 EJB 不需要 Home 接口
所以我认为这样的事情应该可行。
sl = (ServiceLogicLocal)ctx.lookup({JNDI of Local Interface to Bean});
失败并出现以下错误。
java.lang.ClassCastException: com.whatever.hostinterface.ServiceLogicLocal$$$view60 cannot be cast to com.whatever.hostinterface.ServiceLogicLocal
而且我知道不需要 Local Home 界面,但我已经创建了它。尝试使用它并调用它的 create() 方法,会产生相同类型的 ClassCastException,但我失败了,因为我试图将一个对象的视图(代理)投射到该类型的对象中。
本地 EJB 接口和本地 EJB 接口的 ClientView 之间有什么区别,我如何通过其本地接口实例化此 EJB?
谢谢。
默认情况下,Java EE 部署单元(jars、ejb-jars、wars、ears-and-their-contents)彼此隔离。换句话说,一个部署单元中的 类 无法访问其他部署单元中的 类。
这通常是一件好事。
一些 Java EE 实现,例如 JBossAS 和 WildFly,提供了一种覆盖此约束的机制。
如果您的 EJB 和接口打包在一个名为 WhizBang.jar
的 jar 中,那么您可以通过添加一个 WEB-INF/jboss-deployment-structure.xml
文件来使您的 Web 应用程序可以访问此 jar 中的 类它具有以下内容:
<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
<deployment>
<dependencies>
<module name="deployment.WhizBang.jar" />
</dependencies>
</deployment>
</jboss-deployment-structure>
根据以上内容,您可以查找您的 EJB:
InitialContext initialContext = new InitialContext();
ServiceInterface serviceBean = (ServiceInterface)initialContext.lookup("java:global/WhizBangSessionEJB/WhizBangSessionEJB!com.whatever.hostinterface.ServiceLogicLocal");
ServiceLogic remoteService = (ServiceLogic)initialContext.lookup("java:global/WhizBangSessionEJB/WhizBangSessionEJB!com.whatever.hostinterface.ServiceLogic");
我在 WildFly 10.1 中使用此代码。0.Final
这在 Wildfly 中对我有用,
尽管我必须按照提供的方式添加依赖项。
<!-- Business Interfaces of the server EJB. -->
<dependency>
<groupId>com.sample.ejb</groupId>
<artifactId>sample-engine-ejb</artifactId>
<type>ejb</type>
<version>1.0</version>
<scope>provided</scope>
</dependency>
谢谢!!
我认为这个问题是 What is local/remote and no-interface view in EJB?
的延伸我正在尝试将一组 EJB Jar,其 EJB 由 Servlet 以通用方式调用,从 WebLogic 移植到 JBoss。整个系统很旧,EJB 是 2.0。我试图通过将部署描述符更改为 3.2 来更新它。
这部分相对容易。
这是不存在的部分。
参与这个安排的EJB都实现了SessionBean接口。它们的本地和远程接口是通用的,它们继承自一个通用的业务接口。这是部署描述符的示例:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd">
<module-name>WhizBangSessionEJB</module-name>
<enterprise-beans>
<session>
<ejb-name>WhizBangSessionEJB</ejb-name>
<home>com.whatever.hostinterface.ServiceLogicHome</home>
<remote>com.whatever.hostinterface.ServiceLogic</remote>
<local-home>com.whatever.hostinterface.ServiceLogicLocalHome</local-home>
<local>com.whatever.hostinterface.ServiceLogicLocal</local>
<ejb-class>com.whatever.whizbang.ejbs.WhizBangSessionBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
我还要在这里提到这些接口的签名:
public interface ServiceInterface
{
// business interface methods.
}
public interface ServiceLogic extends EJBObject, ServiceInterface
{}
public interface ServiceLogicLocal extends ServiceLogic, EJBLocalObject
{}
所以一个 ServiceLogic 是一个 ServiceInterface。 一个 ServiceLogicLocal 是一个 ServiceLogic,因此是一个 ServiceInterface
使用远程接口,servlet 能够实例化一个 bean,如下所示:
Object home = ctx.lookup({JNDI of Home Interface});
EJBHome obHome = (EJBHome)PortableRemoteObject.narrow(home, EJBHome.class);
Method m = obHome.getClass().getDeclaredMethod("create", new Class[0]);
sl = (ServiceLogic) m.invoke(obHome, new Object[0]);
而且我有我的 EJB,它可以转换为服务逻辑。
但这些 EJB 和 Servlet 将始终在同一个容器中。因此指示了本地接口。这就是我 运行 遇到麻烦的地方。 在 3.x.
中,本地 EJB 不需要 Home 接口所以我认为这样的事情应该可行。
sl = (ServiceLogicLocal)ctx.lookup({JNDI of Local Interface to Bean});
失败并出现以下错误。
java.lang.ClassCastException: com.whatever.hostinterface.ServiceLogicLocal$$$view60 cannot be cast to com.whatever.hostinterface.ServiceLogicLocal
而且我知道不需要 Local Home 界面,但我已经创建了它。尝试使用它并调用它的 create() 方法,会产生相同类型的 ClassCastException,但我失败了,因为我试图将一个对象的视图(代理)投射到该类型的对象中。
本地 EJB 接口和本地 EJB 接口的 ClientView 之间有什么区别,我如何通过其本地接口实例化此 EJB?
谢谢。
默认情况下,Java EE 部署单元(jars、ejb-jars、wars、ears-and-their-contents)彼此隔离。换句话说,一个部署单元中的 类 无法访问其他部署单元中的 类。
这通常是一件好事。
一些 Java EE 实现,例如 JBossAS 和 WildFly,提供了一种覆盖此约束的机制。
如果您的 EJB 和接口打包在一个名为 WhizBang.jar
的 jar 中,那么您可以通过添加一个 WEB-INF/jboss-deployment-structure.xml
文件来使您的 Web 应用程序可以访问此 jar 中的 类它具有以下内容:
<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.3">
<deployment>
<dependencies>
<module name="deployment.WhizBang.jar" />
</dependencies>
</deployment>
</jboss-deployment-structure>
根据以上内容,您可以查找您的 EJB:
InitialContext initialContext = new InitialContext();
ServiceInterface serviceBean = (ServiceInterface)initialContext.lookup("java:global/WhizBangSessionEJB/WhizBangSessionEJB!com.whatever.hostinterface.ServiceLogicLocal");
ServiceLogic remoteService = (ServiceLogic)initialContext.lookup("java:global/WhizBangSessionEJB/WhizBangSessionEJB!com.whatever.hostinterface.ServiceLogic");
我在 WildFly 10.1 中使用此代码。0.Final
这在 Wildfly 中对我有用,
尽管我必须按照提供的方式添加依赖项。
<!-- Business Interfaces of the server EJB. -->
<dependency>
<groupId>com.sample.ejb</groupId>
<artifactId>sample-engine-ejb</artifactId>
<type>ejb</type>
<version>1.0</version>
<scope>provided</scope>
</dependency>
谢谢!!