2014-09-12 91 views
2

EJB 3.x的移植的JNDI暴露實現類

考慮以下EJB實現遠程接口

@Remote 
public interface UnusualRemote { 
... 
} 

@Stateless 
public class UnusualBean implements UnusualRemote{ 
... 
} 

暴露遠程Interaface便攜式JNDI名稱:

java:global/simplejee7/UnusualBean!com.example.UnusualRemote 

我的問題是爲什麼客戶應該知道實現類來查找bea通過jndi。具體來說,爲什麼不能使用接口名稱查找com.example.UnusualRemote

+1

對於本地豆你可以使用CDI bean管理器通過接口來查找豆。使用橋接bean可以擴展遠程調用。 – 2014-10-06 18:42:09

回答

1

我認爲關鍵的一點是遠程接口可以由多個EJB實現,如果客戶端沒有指定實現類,容器無法識別選擇哪一個。

1

這確實是一件愚蠢的事情。當設計便攜式名稱時,某人明顯在睡覺。命名方案是爲了命名特定的bean實現而設計的,但它沒有考慮到實際的查找用例,如果bean確實實現了它,它總是通過接口。

我不同意Gabriel的回答。當然,通過它的接口可以查找bean。當你注入一個具有接口作爲類型的字段時,容器完全做到這一點。

另一個需要考慮的事情是「java:」命名空間通常會返回到本地JVM並且不能用於遠程查找。遠程查找是非常嚴格的指定,但由於JAX-RS沒有人想要解決這個問題。

+0

我認爲Gabriel是對的。我們不能僅使用接口來確定實際的實現類實例。有可能是EJB容器包含具有相同接口的兩個對象實例。但要區分它們,我們必須知道實際的實現類。 – Hansraj 2014-09-16 13:36:51

+0

@Hansraj思考如下:假設你說的是真的,怎麼可以在容器通過接口注入一個實例呢?即如何可以「@Inject私人MyInterface我的;」 「MyInterface」是一個可能工作的界面? – 2014-10-06 18:37:14

-1

這是我怎麼想的/我知道: -

在Java例如,當您「執行/代碼的接口」,當你「調用方法」;你實際上調用了'輸入'到接口的對象;該接口暴露對象的視圖。

最關鍵的meta此處的信息是對象或對象及其「視圖」的「範圍」的標識;這正是存儲在JNDI目錄服務中的內容。 (JNDI樹基本上存儲了可以轉換爲接口名稱的bean對象的代理。)

這裏標識的對象是您分配給bean的JNDI名稱(如果未分配,則爲default),這是一個授權沒有這些,你不能到達/識別對象,並且對象的視圖是接口名稱。

希望得到答案。要添加到: -

更普遍地用於確定全球便攜式JNDI bean名字的語法是: - java:global[/<app-name>]/<module-name>/<bean-name>

如果不指定接口名則表示bean實現一個接口或只有一個類型/ view,因此接口名稱是可選的。

但是,有些情況下,一個bean公開'多個客戶端視圖/實現多個接口';在這種情況下,便攜式JNDI名稱應該是這樣的: -

java:global[/<app-name>]/<module-name>/<bean-name>/<intf-name>

+0

感謝答覆,但遺憾不同意,如果你必須知道的實現細節,什麼接口 – anergy 2014-09-22 11:07:30

+0

的也許你感到困惑與或在您的文章中「UnusualBean」的地步。我們使用該名稱是因爲沒有使用任何註釋來指定其他bean名稱。例如'@ EJB(名字=「foobar的」)'可以使用,你會使用「foobar的」,而不是你的「UnusualBean」查找這個bean。就您的界面名稱而言,如果你的bean實現了多個接口,那麼如何在沒有在查找中指定它的情況下知道哪個視圖/接口要投入或使用。 – Abhin 2014-09-22 14:06:53