[英]Performing a JNDI lookup in a JAXB XmlAdapter
我的項目是Java Enterprise項目,包含三個模塊:
我的域模型駐留在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查找是一個非常好的解決方案還是更有利的?
您可以在JAX-RS方法(在會話bean上)上指定java.io.InputStream
類型的參數。 然后你可以解組那個利用JAXB的InputStream
。 這將使您有機會使用適當的XmlAdapter
配置javax.xml.bind.Unmarshaller
。
欲獲得更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.