Session Bean要求、限制和許可
在EJB規范中,對Session Bean有一些限制和要求。這些限制會指出哪些是bean必須做的,哪些是不能做的,以及bean必須實現的一些方法和接口。也有一些規范指出哪些處理是允許做的,這是為了避免你以為這些處理是被其它限制禁止的。
實現SessionBean接口
session bean必須實現javax.ejb.SessionBean接口
聲明該類為Public,而不是Final或者Abstract
要記住EJB容器需要創建bean實例,因此該類必須是public,而且不是抽象的。
創建一個Pubic,無參數的構造器
同樣,由於EJB容器必須創建bean的實例。如果構造器是protected或者private,容器就不能創建實例。
不要實現finalize方法
雖然你很少需要定義一個finalize方法,不過EJB規范中還是明文禁止在session和entity bean中定義finalize方法。如果你的bean需要做任何清除的操作,它們應該在ejbRemove或者ejbPassivate方法中進行。
實現create方法和所有的remote方法
一個session bean必須實現Home接口中指定的全部create方法,以及Remote接口中指定的全部方法。在實現這些方法時,有一些額外的要求:
. 這些方法必須是public,而不能是static或者final
. 參數和返回的類型必須是有效的RMI/IIOP返回類型。在通常的情況下,這意味著必須是原有的類型(int, char, double等),可串行化的對象或者Remote接口。
. 方法名不能以ejb開頭(這將令EJB的配置工具感到迷惑,並且可能帶來沖突)
可選擇的實現Remote接口
對於一個bean可以實現Remote接口,這個特性也是挺重要的。在實現類中,其中的方法簽名必須和Reomote接口中的一樣,除了一點,就是實現類中的方法並不拋出RemoteException。也就是說,雖然對於Remote接口的每個方法,在實現類中都必須要有相應的方法對應,而且不需要作如下的聲明:
public class ShoppingCartImpl implements SessionBean, ShoppingCart
實現Remote接口的原因是:在漏掉一個方法時編譯器將會告訴你,也就是說,如果沒有實現Remote接口中的一個方法,編譯器將會產生一個錯誤。否則,你將不知道漏掉了一個方法,直到你運行一個配置工具或者是打包工具為止。越遲發現錯誤,就要花越長的時間來改正它。
在實現Remote接口時,可能會遇到的問題是使用this關鍵字來傳送對象,而不是使用session context中的getEJBObject方法。通常,當使用this而不是getEJBObject時,編譯器將會產生一個錯誤,因為它期待一個實現Remote接口的對象,而實現類卻這樣做。通過實現Remote接口,你通過了編譯,但是你在運行時又碰到了錯誤,這是由於與EJB容器期待的不同,實現類並不是一個到Remote接口的正確引用。
提示
雖然實現Remote接口可以指出在編譯時的錯誤,但是這樣也會導致出現一些直到運行時才會發現的錯誤,令修改起來很費時間。所以你最好不要實現Remote接口,而在配置時發現一些錯誤。
實現SessionSynchronization接口
SessionSynchronization接口可以令一個session bean更好地控制一個事務是如何發生。
在必要時擴展其它類
你的實現類也可以是其它類的子類。實際上,該超類也可以是另一類bean的實現類。
在必要時實現Helper方法
一個實現類可能還有額外的helper方法,這些方法並不是Remote或者Home接口的一部分。對於這些方法的參數類型、返回值類型和可見性(public, protected, private)是沒有限制的。
不要拋出RemoteException
如果需要拋出一個和EJB有關的異常,拋出javax.ejb.EJBException代替。
Remote和Home接口的限制
除了對實現類有限制外,對於Remote和Home接口也有一些限制。這些限制大部分和實現類類似。
Remote接口必須擴展javax.ejb.EJBObject
當你使用一些配置工具時,例如WebLogic提供的工具,你將會發現它會自動知道哪個類包含有Remote接口。它尋找EJBObject接口來檢測到Remote接口。還有EJBObject接口包含有每個EJB都必須實現的一些方法。
Home接口必須擴展javax.ejb.EJBHome
和Remote接口必須擴展EJBObject一樣,EJBHome接口幫助標識Home接口,並且定義了一些你可以在每個Home接口上調用的方法。
參數和返回類型必須符合RMI/IIOP
這意味著它們必須是原始類型、可串行化對象或者Remote接口。
所有的方法必須拋出java.rmi.RemoteException
由於Home和Remote接口擴展java.rmi.Remote接口,所以接口的全部方法都必須拋出java.rmi.RemoteException。RMI規范明確規定在Remote接口的所有方法都必須拋出RemoteException。
所有的方法都必須有相應的實現
在一個典型的RMI實現中,這一點是毫無疑問的,這是由於實現類將會實現Remote接口。但是對於EJB,由於實現類並不需要實現Home和Remote接口,對於實現類和Home及Remote接口的關系,編譯器並沒有一個強制的規定。
對於Home接口的每個create方法,在實現類中都必須有一個相應的ejbCreate方法。還有,create方法拋出CreateException。
擴展其它的接口
要支持Enterprise JavaBeans的子類,Home和Remote接口可以擴展其它的接口,只要父接口是擴展EJBObject(對於Remote接口)或者EJBHome(對於Home接口)。