2011-03-01 94 views
0

我是一个遗留系统,那里是一个偏僻豆已经变得过于庞大和单片上的工作,我想保持独立的新功能,我认为需要补充。拆分远程EJB功能的对象

我最初的想法是,而不是增加我的新方法,以现有的接口,创建我所有的东西一个新的接口并添加返回一个实现我的接口的远程对象的一个​​方法。

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

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

@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

这里你的做法是有点混乱。当你创建新的界面,下一步应该是有旧的bean实现了新的接口,就像这样:

public class OldBean implements OldRemoteInterface, NewRemoteInterface { 

你老兄会得到更大的,是的,但这是可以的唯一途径展开旧bean的功能,而不创建新的bean或触摸旧界面。

getNewStuff()返回的对象只是一个普通的对象 - 它不是远程的。这就是为什么你会得到序列化错误,因为RMI试图通过网络传输你的NewRemoteInterface实例。使用@Remote注释它并不会做任何事情(除非实际使用bean上的接口,部署该bean然后使用DI或上下文来检索它)

+0

我看到了,我期待更多的“黑魔法”被执行在添加@Remote注释时引擎盖下。 – fortran 2011-03-01 14:55:07

+0

我希望也是这样! :) – Renan 2011-03-01 22:29:54