我正在开发一个遗留系统,其中有一个变得太大而单片的远程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"
我知道我必须遗漏一些显而易见的事情......: - /
答案 0 :(得分:1)
你的方法有点令人困惑。当你创建新接口时,下一步应该让旧bean实现新接口,如下所示:
public class OldBean implements OldRemoteInterface, NewRemoteInterface {
你的旧bean会变得更大,是的,但这是你可以在不创建新bean或触摸旧界面的情况下扩展旧bean功能的唯一方法。
getNewStuff()返回的对象只是一个普通对象 - 它不是远程的。这就是您遇到序列化错误的原因,因为RMI正在尝试通过网络传输NewRemoteInterface实例。用@Remote注释它没有做任何事情(直到你实际使用bean上的接口,部署该bean然后使用DI或上下文检索它)