我的項目一個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查找是一個完美的解決方案,還是有更好的解決方案?
您的解決方案的工作原理很簡潔,並且不涉及任何黑客。你爲什麼要尋找另一種解決方案? –
@Kingo感謝您的回覆!我很默默,因爲它涉及到將我的EJB的名稱嵌入到靜態字符串中。如果模塊使用不同的名稱進行部署,該怎麼辦?用戶需要在源代碼中進行更改。還有什麼讓我失望的是,雖然你說它不涉及黑客行爲,但在CDI環境中進行JNDI查找確實感覺像。它有多普遍? – Laurens