2012-09-27 73 views
3

接口的各種具體實現我有一個類,任何我需要編組爲XML。如何處理與JAX-B

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassToBeMarshalled { 
    public Interface object; 
} 

該接口是由很多具體類實現的,其中大多數是供應商特定的,我的源代碼無法訪問。

所以我的問題是:

如果我試圖封送類,JAX-B會抱怨接口當前的具體實施沒有在上下文已知的 - 換句話說,具體的類沒有被加載通過調用提供當前實現的JAXBContext.newInstance來進入上下文。

最常見的方式來理清這個問題是:

1)使用XMLSeeAlso - 不是一個可行的選擇,因爲有很多具體的類

2)註釋與@XmlRootElement每個類的 - 不因爲我沒有上所有的課

訪問一個可行的選擇

有誰知道一種方法,使JAX-B負載的具體類到它的上下文在必要時?

謝謝。

P.S:我使用的是JAX-B RI

+1

如果您正在使用的EclipseLink JAXB(莫西),那麼你可以使用下面的策略。 http://blog.bdoughan.com/2010/07/moxy-jaxb-map-interfaces-to-xml.html。解組將創建一個代理,但接口的任何實現都會編組。 –

+0

這就解決了這個問題 - 但不幸的是我必須堅持使用JAX-B。我們的生產環境非常有限,只有JAX-B RI可以在prod盒中使用。可悲的是我不能採用MOXY。謝謝。 – cldjr

+0

你是否控制'Interface'的源代碼?在編組之前遍歷數據結構並收集所有實現類是否可行?所有的實現類是否被設計爲適當的java bean? – MvG

回答

2

你可以標記您object作爲@XmlAnyElement(InterfaceHandler.class)其中InterfaceHandler能夠DOM表示與實際實現類之間轉換的DomHandler。該處理程序可能應該在編組時使用類名稱,並在解組時使用該類名稱來創建實例。它可以手動配置實例,也許使用一些設計用於bean的輔助類,或者可能使用另一個包含專門命名的類的jaxb上下文,並將使用其所有嵌套子對象處理該對象。

也有看@XmlElementRef註釋。我擔心的是,爲了使這個正常工作,你必須至少在編譯時知道所有的實現類,但也許有可以讓這個工作對你的好,比一般的解決方案少一些麻煩的方式在前一段中概述。