2015-07-27 5 views
0

Удаленный вызов метода ejb с параметром, расширенным для результатов клиента с 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 находится в пути к классам клиентских и удаленных приложений, но они загружаются с различными загрузчиков классов (очевидно).

Ожидается ли такое поведение или я что-то упускаю? Как я могу решить этот случай?

ответ

2

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

анонимный класс реализации SimpleEJBTestServlet$1 только известен серверу, но не к клиенту.

Все параметры, типы возврата и исключения должны быть известны обеим сторонам. Невозможно сериализовать то, что другая сторона не знает (это включает в себя подклассы), как и в случае с Reomte EJB, только контент (объекты) сериализуется, а не сами классы.

Я рекомендую хранить их в отдельном JAR, который можно разделить между клиентскими и серверными проектами.

+0

Но «вещь», которую я отправляю путем сериализации, - это SomeAbstractClass, и она находится в пути к классам как удаленных, так и клиентских приложений. Почему имеет значение, как я расширяю или реализую его на клиенте? – Reek

+0

Нет, вы отправляете объект с конкретным динамическим типом (динамическое статическое типирование <->). Что бы вы ожидали, что время выполнения, динамический тип объекта на стороне клиента должно быть? Объект не может иметь абстрактный тип ... – Puce

+0

Тогда это означает: 1) я не могу использовать интерфейсы или абстрактные классы в качестве параметров метода ejb или 2) мне нужно поделиться сведениями о реализации клиента с удаленным приложением, что не имеет ничего общего с ними – Reek

Смежные вопросы