结构: Windows客户端 - > Wildfly JAX-RS服务 - > JBoss 5.1.0.GA遗留系统。
我得到一个java.lang.ClassCastException:当在Wildfly JAX-RS服务和JBoss 5.1.0.GA遗留系统之间进行通信时,无法将javax.naming.Reference强制转换为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。
有没有人看到我所做的任何问题?
谢谢,
的Darren
答案 0 :(得分:2)
感谢您的帮助Gimby,
我在经历了一些混乱之后找到了答案。
来自Wildfly 8.1.0(客户端) - &gt; 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://在remotefly-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());
然后,您可以将引用转换为您的界面并正常使用它。
希望这是有道理的。