簡體   English   中英

在JAXB XmlAdapter中執行JNDI查找

[英]Performing a JNDI lookup in a JAXB XmlAdapter

我的項目是Java Enterprise項目,包含三個模塊:

  • 裝配(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>

通過編寫專用的XmlAdapterModelAdapter並使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM