使用抽象参数远程调用ejb方法

时间:2015-07-27 10:25:20

标签: java ejb-3.0

使用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位于客户端和远程应用程序的类路径中,但它们加载了不同的类加载器(显然)。

这种行为是期待还是我错过了什么?我该如何解决这个案子?

1 个答案:

答案 0 :(得分:2)

  

java.lang.ClassNotFoundException: com.simple.SimpleEJBTestServlet$1

匿名实现类SimpleEJBTestServlet$1仅为服务器所知,而不是客户端。

双方都必须知道所有参数,退货和例外类型。它不可能序列化另一方不知道的东西(这包括子类),就像Reomte EJB一样,只有内容(对象)被序列化,而不是类本身。

我建议将它们保存在单独的JAR中,您可以在客户端和服务器项目之间共享。