Разделение функций удаленного EJB между различными удаленными объектами - PullRequest
0 голосов
/ 01 марта 2011

Я работаю над устаревшей системой, в которой есть удаленный компонент, который стал слишком большим и монолитным, и я хотел бы отделить новую функциональность, которую мне нужно добавить.

Моя первоначальная идея заключалась в том, чтобы вместо добавления новых методов в существующий интерфейс создать новый интерфейс со всеми моими материалами и добавить единственный метод, который возвращает удаленный объект, реализующий мой интерфейс.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я вызываю метод, который возвращает мой объект, среда выполнения пытается его сериализовать вместо отправки заглушки.

Структура кода более или менее такова:

@Stateless
public class OldBean implements OldRemoteInterface {
   //lots of the old unrelated methods here

   public MyNewStuff getMyNewStuff() {
      return new MyNewStuff();
   }
}

@Remote
public interface OldRemoteInterface {
   //lots of the old unrelated methods declared here

   MyNewStuff getMyNewStuff();
}

public class MyNewStuff implements NewRemoteInterface {
   //methods implemented here
}

@Remote
public interface NewRemoteInterface {
   //new methods declared here
}

И я получаю исключение:

"IOP00810267: (MARSHAL) An instance of class MyNewStuff could not be marshalled:
the class is not an instance of java.io.Serializable"

Я пытался сделать это «по-старому», расширяя интерфейс java.rmi.Remote вместо использования аннотации ejb @Remote, и получаю исключение:

"IOP00511403: (INV_OBJREF) Class MyNewStuff not exported, or else is actually 
a JRMP stub"

Я знаю, что, должно быть, мне не хватает чего-то, что должно быть очевидным ...: - /

1 Ответ

1 голос
/ 01 марта 2011

Ваш подход немного сбивает с толку.когда вы создали новый интерфейс, следующим шагом должно было стать то, что старый бин должен реализовывать новый интерфейс, например:

public class OldBean implements OldRemoteInterface, NewRemoteInterface {

Ваш старый бин станет больше, да, но это единственный способвы можете расширить функциональность вашего старого компонента без создания нового компонента или прикосновения к старому интерфейсу.

Объект, возвращаемый функцией getNewStuff (), является простым объектом - он не удаленный.Вот почему вы получаете ошибки сериализации, потому что RMI пытается передать ваш экземпляр NewRemoteInterface через сеть.Аннотирование его с помощью @Remote ничего не делает (пока вы на самом деле не используете интерфейс в bean-компоненте, разверните этот bean-компонент и затем получите его, используя DI или Contexts)

...