假设有一个EJB方法接受实现某个接口的对象。
MyStatelessBean.method(InterfaceA aObj);
因此服务器实现了MyStatelessBean,并且InterfaceA在其类路径中可用。
现在, InterfaceA的具体类在客户端实现。这些具体类在服务器的类路径中不。
现在,当客户端调用服务器并将具体类的实例传递给EJB方法时,
InterfaceA concreteObjA = new InterfaceA() { ... }
bean = context.lookup(ejbLookupStr);
bean.method(concreteObjA);
预期的行为是什么?
我在WildFly 9.0.2中的测试导致在客户端日志中报告了ClassNotFoundException(但它似乎报告了服务器端问题)。
线程“main”中的异常javax.ejb.EJBException: 抛出java.lang.ClassNotFoundException: 来自[Module。的org.ktest.study.javaee.ejb.CallBackClient 来自服务模块的“deployment.wildfly-ear.ear.wildfly-ejb.jar:main” 装载机] org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:238) 在 org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) 在 org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) 在com.sun.proxy。$ Proxy0.register(未知来源)at org.ktest.study.javaee.ejb.ClientObject.main(ClientObject.java:21)
答案 0 :(得分:0)
回答我自己的问题:
实际上我的要求是使用RMI进行服务器到客户端的回调。服务器提供CallBack接口。但是客户可以提供具体的实施方案。由于EJB使用序列化将对象从客户端传递到服务器,因此需要在服务器端提供具体类以进行反序列化。
我的RMI代码中有一个导致错误的错误。