WildFly 10查找EJB遇java.net.UnknownHostException问题求助
解决WildFly 10中EJB查找的
java.net.UnknownHostException问题 我看你在WildFly 10上用JDK 8尝试查找EJB时碰到了java.net.UnknownHostException: http-remoting://localhost的异常,这问题根源在于你还在使用旧版JBoss AS的命名配置,而WildFly 10已经采用了全新的EJB客户端命名机制,旧配置自然不兼容。下面一步步帮你解决:
1. 移除过时的JNP相关配置
你代码里的这些属性都是旧版JBoss的遗留配置,WildFly 10已经不再支持了,直接删掉就行:
properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); properties.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
2. 配置WildFly 10正确的EJB客户端参数
替换成以下符合WildFly 10规范的配置:
Properties properties = new Properties(); // 使用WildFly官方的远程命名工厂 properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); // http-remoting协议地址,旧工厂无法识别该协议才导致主机解析错误 properties.put(javax.naming.Context.PROVIDER_URL, "http-remoting://localhost:9080"); // 开启EJB上下文支持,这个属性可以保留 properties.put("jboss.naming.client.ejb.context", "true"); // 如果你的EJB配置了认证,需要添加以下两行(替换成你的用户名密码) // properties.put(javax.naming.Context.SECURITY_PRINCIPAL, "your-username"); // properties.put(javax.naming.Context.SECURITY_CREDENTIALS, "your-password");
3. 确保依赖正确引入
WildFly 10的EJB客户端需要特定的依赖包,如果你用Maven管理项目,直接在pom.xml里添加:
<dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-ejb-client-bom</artifactId> <version>10.1.0.Final</version> <type>pom</type> <scope>provided</scope> </dependency>
如果是手动管理依赖,要确保项目里包含jboss-ejb-client.jar、jboss-remote-naming.jar等相关Jar包(这些都可以从WildFly安装目录的client文件夹里找到)。
4. 完整的EJB查找示例代码
给你一个完整的可参考代码片段,包含WildFly专属的JNDI命名格式:
InitialContext initialContext = null; try { Properties properties = new Properties(); properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); properties.put(javax.naming.Context.PROVIDER_URL, "http-remoting://localhost:9080"); properties.put("jboss.naming.client.ejb.context", "true"); initialContext = new InitialContext(properties); // WildFly EJB的JNDI格式:ejb:[应用名]/[模块名]/[唯一标识]/[Bean类名]![远程接口全限定名] // 示例:假设你的EJB部署在MyApp应用,模块是MyEJBModule,Bean是UserServiceBean,远程接口是com.example.UserServiceRemote String jndiName = "ejb:MyApp/MyEJBModule//UserServiceBean!com.example.UserServiceRemote"; UserServiceRemote ejbRemote = (UserServiceRemote) initialContext.lookup(jndiName); // 调用EJB方法 ejbRemote.sayHello(); } catch (NamingException e) { e.printStackTrace(); } finally { if (initialContext != null) { try { initialContext.close(); } catch (NamingException e) { e.printStackTrace(); } } }
5. 额外排查点
- 确认WildFly 10服务器正在运行,且
standalone.xml里配置的http端口确实是9080(默认是8080,如果你改了端口才用9080); - 试试把
localhost换成127.0.0.1,避免本地主机名解析问题; - 如果是远程服务器,确保防火墙开放了对应的http-remoting端口。
内容的提问来源于stack exchange,提问作者subbu royal
相关产品推荐
相关产品推荐

