2010-01-28 32 views
3

我有部署了企業應用程序A和B(在WLS 10.0中)。 A是「框架」,B是客戶端應用程序。 客戶端發出如下呼籲:需要幫助瞭解JNDI和J2EE中的特定ClassCastException

Object o = ctx.lookup(jndiName); // line 1 
cf = (ConnectionFactory) o; // line 2 

連接工廠是一個接口,定義爲:

public interface ConnectionFactory 
    extends java.io.Serializable, javax.resource.Referenceable { 
    ... 
} 

什麼情況是:

  1. 如果包含接口類的罐子上系統類路徑,第2行執行正常
  2. 如果接口類不在系統類路徑上,但是包裝的機智h應用程序分開,第2行拋出ClassCastException(其中o是ConnectionFactoryImpl的信息文本)

爲什麼會這樣?我假設JNDI查找只返回一個存根到遠程對象(我是否正確?),那麼爲什麼接口類的類加載器是不同的呢?

這樣回答,我的期望:

  1. 是的,它應該發生,你體驗的方式,因爲...
  2. 不,應該不是,因爲如果出現這種情況了,然後...... ...,所以你的設置中有些東西是可疑的
  3. 你描述的情況非常奇怪,你確定你不會錯過某個地方的某個地方嗎?
  4. ... :)

這也將是很好,如果有人能闡明如何在JNDI和存根的工作,哪裏鑄造發生(在客戶端上的存根?還是原來的對象上遠端?)等。

感謝您的幫助!

回答

2

不幸的是,答案是(1)。

JNDI並沒有規定如何將對象存儲在樹上,或如何將其傳遞給客戶端的機制。這只是一個用於執行操作的API。

如果這兩個應用程序都在同一個JVM中,就像它們在這裏一樣,那麼Weblogic很可能只是將對象直接交給客戶端應用程序。沒有存根,而且「偏遠的一面」。由於該對象實現的類型對客戶端應用程序不可見(請記住,類型標識是由類名稱定義的,也是由其加載的類加載器定義的)。

您可能認爲這是一件奇怪的事情發生,但請記住,像這樣的應用程序之間交談並不是JavaEE開發中的常態 - 應用程序應該彼此隔離,只共享系統級別資源。

+1

感謝您的回答。令我困惑的是,Weblogic寫了關於EJB的內容,即應用程序間的EJB調用只能通過遠程接口進行。我知道這與EJB無關,但我推斷,請求駐留在其他應用程序中的JNDI對象會訴諸某種類似的遠程機制,這不應該是真的。 – ron 2010-01-28 08:58:15

+0

這是正確的,是的。當在JNDI上發佈可遠程訪問的EJB時,它明確發佈存根。 – skaffman 2010-01-28 09:44:06