在不同的远程对象之间拆分远程EJB功能

时间:2011-03-01 10:02:14

标签: java java-ee ejb-3.0 remoting

我正在开发一个遗留系统,其中有一个变得太大而单片的远程bean,我想将我需要添加的新功能分开。

我最初的想法是,不是将我的新方法添加到现有界面,而是创建一个包含所有内容的新界面,并添加一个返回实现我的界面的远程对象的方法。

我现在面临的问题是,当我调用返回我的对象​​的方法时,运行时会尝试序列化它而不是发送存根。

代码布局或多或少是这样的:

@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 个答案:

答案 0 :(得分:1)

你的方法有点令人困惑。当你创建新接口时,下一步应该让旧bean实现新接口,如下所示:

public class OldBean implements OldRemoteInterface, NewRemoteInterface {

你的旧bean会变得更大,是的,但这是你可以在不创建新bean或触摸旧界面的情况下扩展旧bean功能的唯一方法。

getNewStuff()返回的对象只是一个普通对象 - 它不是远程的。这就是您遇到序列化错误的原因,因为RMI正在尝试通过网络传输NewRemoteInterface实例。用@Remote注释它没有做任何事情(直到你实际使用bean上的接口,部署该bean然后使用DI或上下文检索它)