使用ClassNotFoundException在客户端结果上使用扩展参数远程调用ejb方法。
例如:
@Stateless
public class EjbService implements EjbServiceRemote {
public void doSth(SomeAbstractClass sac) {
//do sth with sac
}
}
@Remote
public interface EjbServiceRemote {
public void doSth(SomeAbstractClass sac);
}
package com.simple;
public class SimpleEJBTestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
EjbServiceRemote ejbRemote = //lookup stuff
SomeAbstractClass sac = new SomeAbstractClass {}; //extend it
ejbRemote.doSth(sac); //results in ClassNotFound
}
}
例外:
Servlet.service() for servlet SimpleEJBTestServlet threw exception: java.lang.RuntimeException: JBAS014154: Failed to marshal EJB parameters
java.lang.ClassNotFoundException: com.simple.SimpleEJBTestServlet$1 from [Module "deployment.simpleEjbService.ear.simpleEjb:main" from Service Module Loader]
SomeAbstractClass位于客户端和远程应用程序的类路径中,但它们加载了不同的类加载器(显然)。
这种行为是期待还是我错过了什么?我该如何解决这个案子?
答案 0 :(得分:2)
java.lang.ClassNotFoundException: com.simple.SimpleEJBTestServlet$1
匿名实现类SimpleEJBTestServlet$1
仅为服务器所知,而不是客户端。
双方都必须知道所有参数,退货和例外类型。它不可能序列化另一方不知道的东西(这包括子类),就像Reomte EJB一样,只有内容(对象)被序列化,而不是类本身。
我建议将它们保存在单独的JAR中,您可以在客户端和服务器项目之间共享。