ClassCastException при удаленном вызове EJB, который существует на одном сервере - PullRequest
1 голос
/ 17 июня 2010

У меня есть 2 ejbs.Ejb-A, который вызывает Ejb-B.Они не в одном ухе.

Для переносимости Ejb-B может существовать или не существовать на одном сервере.(Существует внешний файл свойств с URL-адресами поставщика Ejb-B. Я не могу это контролировать.)

Пример кода: в Ejb-A

EjbBDelegate delegateB = EjbBDelegateHelper.getRemoteDelegate(); // lookup from list of URLs from props... 
BookOfMagic bom = delegateB.getSomethingInteresting();

Использовать случаи / результаты :

  1. Когда Ejb-B НЕ СУЩЕСТВУЕТ на том же сервере, что и Ejb-A, все работает правильно.(он циклически перебирает URL-адреса)
  2. Когда Ejb-B EXIS EXIST на том же сервере, и Ejb-A вызывает Ejb-B на том же сервере, все работает правильно.
  3. Когда Ejb-B СУЩЕСТВУЕТ на одном сервере, а Ejb-A вызывает Ejb-B на другом сервере, я получаю:

javax.ejb.EJBException: вложенное исключение: java.lang.ClassCastException: $ Proxy126 java.lang.ClassCastException: $ Proxy126

Я использую Weblogic 10.0, Java 5, EJB3

По сути, если Ejb-B существует на сервере, он должен вызываться ТОЛЬКО на этом сервере.

Что наводит меня на мысль, что класс загружается локальным загрузчиком классов (при развертывании?), Затем при удаленном вызове его загружает другой загрузчик классов.(вызывая Исключение) Но это должно работать, как это должно быть Сериализовано в загрузчик классов назначения ...

Что я делаю не так ??

Кроме того, при локальном воспроизведении Ejb-A предпочитает Ejb-B на том же сервере, поэтому его было сложно воспроизвести.Но на других машинах это было не так.

ПРИМЕЧАНИЕ. Это все работало правильно для EJB2

1 Ответ

1 голос
/ 22 июня 2010

Таким образом, я смог «исправить» эту проблему, добавив @ RemoteHome (MyRemoteHome.class) к компоненту

public interface MyRemoteMethods {
    String myMethod() throws RemoteException; // this Ex is required
}

public interface MyRemote extends EJBObject, MyRemoteMethods { 
}

public interface MyRemoteHome extends EJBHome {
    public MyRemote create() throws CreateException, RemoteException;
}

тогда мой боб

...
@RemoteHome(MyRemoteHome.class)
public class MyBean implements MyRemoteMethods {
...

Раньше существовал только компонент и интерфейс Remote. (нет локального использования)

В целом, это исправление делает мой EJB 3 немного более EJB 2-ишным и не таким чистым (больше кода и задействованных классов). Мне также непонятно, почему я могу выполнить поиск jndi для интерфейса RemoteHome (и вызвать create) с моего локального и удаленных серверов и не получить исключение ClassCastException, но когда я делаю это для интерфейса Remote, я сделать получить исключение ClassCastException. Это ошибка в Weblogic? (Я также видел некоторые сообщения, похожие на JBoss)

...