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