在JBoss下通過本地接口訪問EJB
在JBoss訪問EJB,如果包含EJB的jar,JBoss訪問EJB和要通過local接口訪問EJB的war不被打包成一個ear來部署,會遇到問題。
如果你的war中包含了EJB的local接口的class,那么war在通過jndi取得EJB的引用試圖將其轉(zhuǎn)化成接口類型時會拋 ClassCastException。而如果war中不包含local接口的class,則會拋class not found的異常。這都是由討厭的classloader問題導致的。每個放到JBoss的deploy目錄里的部署單元都有自己的獨立的 classloader樹,這兩棵樹在jvm的classloader里是平級的。
如果war和EJB jar里都包含了某個EJB的local接口的class時,那么同一個類就分別存在于兩棵classloader樹中。通過jndi取得的引用的類型是 EJB jar中的local接口的類型,將其轉(zhuǎn)化成war里的那個local接口類型時就出錯了,因為它們不是同一個類。
而classloader是不能訪問同級的其他的classloader下的類的,所以如果war里不包含接口的class,有會因找不到class而出錯。
JBoss訪問EJB這種時候就是使用ear的時候,位于同一個ear里EJB jar的classloader是war的classloader的父classloader。
這樣,只需要部署一份接口類,war也能訪問到它,因為子 classloader能訪問父classloader載入的類。
【編輯推薦】