【问题标题】:@Remote JNDI Communication: Wildfly to JBoss AS 5.1.0.GA@Remote JNDI 通信:Wildfly 到 JBoss AS 5.1.0.GA
【发布时间】:2014-11-26 10:33:12
【问题描述】:

架构: Windows 客户端 -> Wildfly JAX-RS 服务 -> JBoss 5.1.0.GA 旧系统。

我收到 java.lang.ClassCastException: javax.naming.Reference 在 Wildfly JAX-RS 服务和 JBoss 5.1.0.GA 旧系统之间通信时无法转换为 com.interfaces.GroupBookingManagerRemote。

当我从 Wildfly 与 JBoss AS 5.1.0.GA 通信时,我正在尝试使用 JNDI 进行连接。

在我的 Wildfly Server Maven pom 中,我包括:

<dependency>
    <groupId>jboss</groupId>
    <artifactId>jnp-client</artifactId>
    <version>4.2.2.GA</version>
</dependency>

这使我可以访问所需的 org.jnp.* 类和接口。

我只需使用以下代码连接到我的远程计算机并取回 GroupBookingManager。但是,当我尝试将类强制转换为接口 GroupBookingManagerRemote 时,就会出现问题。

Properties env = new Properties();
env.setProperty(Context.PROVIDER_URL, "jnp://myremoteserver:1099");
env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); 
InitialContext initialContext = new InitialContext(env);

Object ref = initialContext.lookup("MyEARFile/GroupBookingManager/remote");
if (ref != null) {
    bookingManager = (GroupBookingManagerRemote) ref; // java.lang.ClassCastException: javax.naming.Reference cannot be cast
}

我有一个 myclient.jar 文件,已添加到我的 Wildfly 应用程序中,其中包含远程接口 GroupBookingManagerRemote。

有人发现我所做的有什么问题吗?

谢谢,

达伦

【问题讨论】:

  • 伙计,这是用时间机器回去...可能你没有投射对象,但你需要做 PortableRemoteObject.narrow(ref, GroupBookingManagerRemote.class); (不知道对不对,我是从很老的公司wiki文章中挖出来的)
  • 不幸的是,这给了我以下信息:java.lang.ClassCastException: javax.naming.Reference cannot be cast to org.omg.CORBA.Object
  • 那么很可能是依赖错误。该版本很奇怪 - 看起来您正在使用来自 JBoss 4.2.2 的 JBoss 5.1 的依赖项。 JBoss 总是有一个通用的 jboss-as-client 依赖项,用于从客户端连接到 JBoss 服务器,尝试使用它。 mvnrepository.com/artifact/org.jboss.jbossas/jboss-as-client/…
  • 嗨 Gimby,我知道你在做什么,但是在 maven 中我只能找到 4.2.2 版本作为最新的 jnp 客户端。 mvnrepository.com/artifact/jboss/jnp-client
  • 但是你忽略了我的另一半评论。

标签: java maven jboss jndi wildfly-8


【解决方案1】:

感谢您的帮助金比,

经过一番折腾,我自己找到了答案。

从 Wildfly 8.1.0(客户端)-> JBoss AS 5

您不需要任何 JBoss 5 罐子

首先,您需要参考您希望在客户端使用的接口。这可以在 your-project-client.jar 中。如果使用 Maven,您可以创建存储库并使用 mvn 构建 Maven 目录结构

mvn install:install-file -DlocalRepositoryPath=DirectoryName -DcreateChecksum=true -Dpackaging=jar -Dfile=Path-to-you-project-client.jar -DgroupId=YourGroupId -DartifactId=YourartifactId -Dversion=1.0

然后为了连接到远程机器并将接口转换回你的接口,你使用:

final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
env.put(Context.PROVIDER_URL, "remote://remoteserver:4447");
InitialContext initialContext = new InitialContext(env);

这使用Wildfly remote:// 远程命名和wildfly-ejb-client-bom中的ejb

<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-ejb-client-bom</artifactId>
    <version>8.1.0.Final</version>
    <scope>compile</scope>
    <type>pom</type>
</dependency> 

而且我还需要这种依赖来进行通信

<dependency>
    <groupId>org.jboss.xnio</groupId>
    <artifactId>xnio-nio</artifactId>
    <version>3.2.2.Final</version>
    <scope>compile</scope>
</dependency>

这个用于远程命名。

<dependency>
    <groupId>org.jboss</groupId>
    <artifactId>jboss-remote-naming</artifactId>
    <version>2.0.1.Final</version>
</dependency>                   

另请注意,该端口不是 JBoss 5 JNDI:1099 的常用端口,这是默认远程处理端口:4447

Object ref = initialContext.lookup("ejb:Your-EAR/YourClass/remote!" + YouClass.class.getName());

然后您可以将您的引用投射到您的界面并正常使用它。

希望这是有道理的。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2023-03-09
    相关资源
    最近更新 更多