我正在使用IntelliJ IDEA 2016和WildFly 10创建一个简单的客户端 - 服务器Java EE应用程序。
我创建了一个新的Java EE Project EJB_final_test 并添加了两个模块:
Java模块 EJB_test_client
EJB模块 EJB_test_server
然后我set artifact作为Java EE Application Archive,为 EJB_test_server 模块创建 EJBTestEAR.ear 文件。
我在WildFly服务器上部署了这个EAR文件。服务器运行良好,并在启动时成功部署工件。
这是我的 jboss-ejb-client.properties 文件:
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8180
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
以下是 EJB_test_client 模块中仅有ClientTest
类的代码:
package test;
import facade.TestFacadeBeanRemote;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Properties;
public class ClientTest {
public static void main(String[] args) throws Exception {
Properties jndiProperties = new Properties();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
Context ctx = new InitialContext(jndiProperties);
TestFacadeBeanRemote remote = (TestFacadeBeanRemote) ctx.lookup("ejb:EJBTestEAR/EJB_test_server//TestFacadeBean!facade.TestFacadeBeanRemote");
System.out.println(remote.tstPlus("Hello", "World"));
}
}
这是类TextExecutiveBean, TestFacadeBean, TestFacadeBeanRemote
的代码,它们都在模块EJB_test_server中:
TestExecutiveBean 类:
package executive;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
@Stateless
@LocalBean
public class TestExecutiveBean {
public String doPlusOperation(String str1, String str2) {
return str1 + " " + str2 + " " + str1;
}
}
TestFacadeBean 类:
package facade;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import executive.TestExecutiveBean;
@Stateless
public class TestFacadeBean implements TestFacadeBeanRemote {
@EJB
private TestExecutiveBean test2;
public String tstPlus(String str1, String str2) {
return test2.doPlusOperation(str1, str2);
}
}
TestFacadeBeanRemote 接口:
package facade;
import javax.ejb.Remote;
@Remote
public interface TestFacadeBeanRemote {
public String tstPlus(String str1, String str2);
}
当我尝试运行ClientTest
main方法,尝试与服务器通信以在 EJBTestEAR 中查找tstPlus()
方法时,我遇到以下异常:
线程“main”中的异常java.lang.IllegalStateException: EJBCLIENT000025:没有可用于处理的EJB接收器 [appName:EJBTestEAR,moduleName:EJB_test_server,distinctName:] 调用上下文的组合 org.jboss.ejb.client.EJBClientInvocationContext@184f6be2 at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798) 在 org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128) 在 org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) 在 org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255) 在 org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200) 在 org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) 在 org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) 在com.sun.proxy。$ Proxy0.tstPlus(未知来源)at test.ClientTest.main(ClientTest.java:20)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
请问,我该如何解决此错误?难道我做错了什么?我在服务器上部署的工件的配置是对吗?