WildFly 29中EJB调用遇ClassNotFoundException与NamingException求助
EJB客户端ClassNotFoundException问题解决
我是Java Bean尤其是Enterprise Java Bean(EJB)的初学者,查阅资料后编写了一个简单的服务端应用并部署到WildFly 29中。随后编写客户端应用进行测试时,出现了如下错误:
Oct 06, 2023 1:36:10 PM org.jboss.logmanager.JBossLoggerFinder getLogger ERROR: The LogManager accessed before the "java.util.logging.manager" system property was set to "org.jboss.logmanager.LogManager". Results may be unexpected. Exception in thread "main" javax.naming.NamingException: Failed to lookup [Root exception is java.lang.ClassNotFoundException: com.mamisa.MamisoaRemote] at org.wildfly.naming.client.util.NamingUtils.namingException(NamingUtils.java:171) at org.wildfly.naming.client.remote.RemoteClientTransport.lookup(RemoteClientTransport.java:291) at org.wildfly.naming.client.remote.RemoteContext.lambda$lookupNative$0(RemoteContext.java:190) at org.wildfly.naming.client.NamingProvider.performExceptionAction(NamingProvider.java:222) at org.wildfly.naming.client.remote.RemoteContext.performWithRetry(RemoteContext.java:100) at org.wildfly.naming.client.remote.RemoteContext.lookupNative(RemoteContext.java:188) at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:74) at org.wildfly.naming.client.store.RelativeFederatingContext.lookupNative(RelativeFederatingContext.java:58) at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:74) at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:60) at org.wildfly.naming.client.AbstractFederatingContext.lookup(AbstractFederatingContext.java:66) at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:144) at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409) at App.main(App.java:19) Caused by: java.lang.ClassNotFoundException: com.mamisa.MamisoaRemote at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:129) at org.jboss.marshalling.AbstractClassResolver.resolveProxyClass(AbstractClassResolver.java:141) at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:1036) at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1381) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:298) at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:231) at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41) at org.wildfly.naming.client.remote.RemoteClientTransport.lookup(RemoteClientTransport.java:275) ... 12 more
服务端代码
远程接口
package com.mamisa; import jakarta.ejb.Remote; @Remote public interface MamisoaRemote{ public void hello(); }
EJB实现类
package com.mamisa; import jakarta.ejb.Remote; import jakarta.ejb.Stateless; @Stateless public class Mamisoa implements MamisoaRemote{ @Override public void hello() { System.out.println("hello"); } }
客户端代码
import java.util.Hashtable; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import com.mamisa.MamisoaRemote; public class App{ public static void main(String[] args) throws NamingException { final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory"); jndiProperties.put(Context.PROVIDER_URL, "remote+http://127.0.0.1:8080/"); Context context = new InitialContext(jndiProperties); MamisoaRemote mr = (MamisoaRemote) context.lookup("mamisosa/Mamisoa!com.mamisa.MamisoaRemote"); mr.hello(); } }
解决方案
同步远程接口到客户端
核心错误是客户端找不到com.mamisa.MamisoaRemote类,需要将服务端的这个接口类(保持包名完全一致)添加到客户端的类路径中。可以把接口单独打包成jar,或者直接复制class文件到客户端项目的对应包目录下。修正JNDI查找名称
客户端lookup的名称mamisosa/Mamisoa!com.mamisa.MamisoaRemote存在拼写错误(mamisosa多了一个s,应为mamisoa)。另外WildFly中远程EJB的标准JNDI格式为:ejb:<应用名>/<模块名>/<Bean类名>!<远程接口全限定名>如果部署的jar没有指定应用名和模块名,可简化为
ejb:/Mamisoa!com.mamisa.MamisoaRemote,或者查看WildFly启动日志,找到EJB部署时输出的准确JNDI绑定信息。解决日志管理器警告
在启动客户端时添加JVM参数:-Djava.util.logging.manager=org.jboss.logmanager.LogManager同时确保客户端依赖中包含
jboss-logmanager相关jar包。检查客户端依赖完整性
客户端需要引入WildFly远程EJB客户端的依赖,确保类路径中包含wildfly-naming-client、jboss-marshalling等必要jar包,避免因依赖缺失导致类加载问题。
内容的提问来源于stack exchange,提问作者G2HP
相关产品推荐
相关产品推荐

