2011-03-01 70 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