2011-10-12 67 views
3

我的項目一個JNDI查找是一個Java企業項目,由三個模塊組成:執行的JAXB XmlAdapter

  • 大會(EAR)
    • EJB(JAR)
    • 網(WAR)

我的域模型駐留在EJB中。這包括一個Manufacturer課程和一個Model課程。兩者之間存在一對多的關係。我通過駐留在我的Web項目中的REST接口公開這些製造商和模型的實例。

每當我訪問的這些製造商之一,將產生以下XML代碼:

<manufacturer id=1> 
    <name>Ford</name> 
    <models> 
     <model id=1> 
      <name>Fiesta</name> 
     </model> 
     <model id=2> 
      <name>Focus</name> 
     </model> 
    </models> 
</manufacturer> 

不過,我希望它是這樣的:

<manufacturer id=1> 
    <name>Ford</name> 
    <models> 
     <model>1</model> 
     <model>2</model> 
    </models> 
</manufacturer> 

我已經實現了預期的效果通過編寫專門的XmlAdapter,ModelAdapter並用@XmlJavaTypeAdapter(ModelAdapter.class)註釋Manufacturer類中的字段。這個適配器也駐留在我的EJB模塊中。出現問題,但是,Model需要解組時:

private ModelFacade modelFacade; 

@Override 
public Model unmarshal(Long id) throws Exception { 
    return modelFacade.find(id); 
} 

ModelFacade,無狀態會話bean,不能注入XmlAdapter,因此解組過程總是會失敗。

我建議編寫一個MessageBodyReader以便能夠「手動」實例化適配器並將外觀作爲參數傳遞,但是這個專用的消息體讀取器需要在Web模塊中實現。我非常想在EJB模塊中包含這種行爲,原因很簡單,如果我決定創建依賴於EJB的桌面應用程序,我不需要再次處理相同的問題。

爲了實現這種行爲,我可以在適配器的構造進行JNDI查找:

public AbstractAdapter(String name) throws NamingException { 
    facade = (AbstractFacade<B>) lookup("java:app/MyEJB/" + name); 
} 

private Object lookup(String name) throws NamingException { 
    Context c = new InitialContext(); 
    return c.lookup(name); 
} 

,這將完全正常工作,但我不知道這是正確的方式去。從EJB模塊中進行JNDI查找是一個完美的解決方案,還是有更好的解決方案?

+1

您的解決方案的工作原理很簡潔,並且不涉及任何黑客。你爲什麼要尋找另一種解決方案? –

+0

@Kingo感謝您的回覆!我很默默,因爲它涉及到將我的EJB的名稱嵌入到靜態字符串中。如果模塊使用不同的名稱進行部署,該怎麼辦?用戶需要在源代碼中進行更改。還有什麼讓我失望的是,雖然你說它不涉及黑客行爲,但在CDI環境中進行JNDI查找確實感覺像。它有多普遍? – Laurens

回答