【发布时间】:2023-04-04 14:33:01
【问题描述】:
我在同一个 WAS 8.5 JVM 上有两个应用程序。 “服务器应用程序”包含一个 @Remote bean,“客户端应用程序”调用它。
“服务器应用程序”被打包为 EAR 文件。 “客户端应用程序”是一个 JAR 文件,可将自身移植到现有的 Web 应用程序中。
当我构建一个“EJB 接口 JAR”并将它包含在两个应用程序中时,一切都很好。
但是,我在一个深奥的环境中工作,这使我无法在生产中这样做。相反,我可以将远程 EJB 接口包含在“客户端应用程序”的“胖 JAR”化身中。
我正在使用 Maven 来组装这个“胖客户端应用程序 JAR”。我有一个构建上面提到的“EJB 接口 JAR”的 Maven 模块。我将此模块声明为“客户端应用程序”模块的依赖项。然后我这样做:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>assemble-all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
生成的“jar-with-dependencies”确实包含 EJB 接口。但是,将 bean 转换为所述接口时出现错误。
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
environment.put(javax.naming.Context.PROVIDER_URL, "corbaloc:iiop:localhost:2810");
javax.naming.Context ctx = new InitialContext(environment);
engine = (UXServerRemote) ctx.lookup("java:global/myapp/my-ejb/UXServerBean!com.myapp.client.UXServerRemote");
错误:
java.lang.ClassCastException:com.myapp.client._UXServerRemote_Stub 与 com.myapp.client.UXServerRemote 不兼容
显然,WAS 在投射对象时非常谨慎。如何以 WAS 接受的与其“EJB 接口 JAR”副本相同的方式将我的 EJB 接口放在“客户端应用程序 JAR”中?
【问题讨论】:
-
请分享您正在使用的常量INITIAL_CONTEXT_FACTORY、PROVIDER_URL、UX_SERVER_BEAN的值。
-
用实际值替换了常量。
-
我认为您使用的 JNDI 名称不正确。这是通过 JBoss 中的 JNDI 读取 (java:global) EJB 的方式。在 websphere 中,您需要使用 java:comp/env/something ,其中 something = 您在 web.xml 中定义为
的内容 -
@Sampada JNDI 名称看起来不错。
java:global自 EE 6 起有效。 -
@FredericFortier
java:global查找应该自动缩小 _UXServerRemote_Stub 以便它在客户端中可用。如果在ctx.lookup之前打印UXServerRemote.class.getClassLoader()和Thread.currentThread().getContextClassLoader().loadClass(UXServerRemote.class).getClassLoader()的值,它们的值如何比较?