EJB3方法调用的错误及其处理

在WildFly AS 10上部署EJB服务,在Eclispe中运行单元测试,遇到错误及其解决方法。


异常一:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
	at javax.naming.InitialContext.lookup(InitialContext.java:417)

解决办法:将%WildFly%/bin/jboss-client.jar加入到buildclasspath


异常二:

java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
	at org.jboss.ejb.client.Logs.<clinit>(Logs.java:53)
	at org.jboss.ejb.client.naming.ejb.EjbNamingContext.createEjbProxy(EjbNamingContext.java:188)
	at org.jboss.ejb.client.naming.ejb.EjbNamingContext.lookup(EjbNamingContext.java:176)
	at javax.naming.InitialContext.lookup(InitialContext.java:417)

运行环境如下:

JDK 1.8

来自WildFly的jboss-client.jar

log4j-1.2.jar

...

经过排查,发现classpath下还有来自JBoss AS的jbossall-client.jar,该文件中包含了过时org.jboss.logging.Logger类,导致异常。

将其从classpath中删除即可。



异常三:

javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
	at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
	at javax.naming.InitialContext.lookup(InitialContext.java:417)
解决办法:JNDI名称必须以"ejb:..."的形式,如 " ejb: EthernetPM/EthernetPMEJB/EthernetPMServiceBean!com.jdsu.netcomplete.service.ethernetpm.EthernetPMServiceRemote"


异常四:

java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:CustomView, moduleName:SecurityDelegateEJB, distinctName:] combination for invocation context org.jboss.ejb.client.EJBClientInvocationContext@12e5a8e
	at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798)
	at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:116)
	at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186)
	at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255)
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200)
	at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183)
	at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146)
这是EJB调用的经典问题,常常被遇到,常常被忽略。
解决办法:务必将jboss-ejb-client.properties文件加入到classpath




你可能感兴趣的:(ejb,单元测试,Logger,jbossall-client)