2011-10-26 51 views
6

我必須生成一個xml元素,它可以具有任何「原始類型」(xsd:string,xsd:boolean等)的值。例子:JAXB - 僅爲元素的特定子類型設置XmlAdapter?

<field xsi:type="xsd:string" name="aString">String Value</field> 
<field xsi:type="xsd:dateTime" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 
... 

所以,我用這個實現,使JAXB決定基本類型的xsi:type

public class Field { 
    @XmlAttribute 
    private String name; 

    @XmlElement 
    Object value; 
} 

,它是按預期工作,但所有的java.util.Date得到類型xs:dateTime ...

現在我想改變編組的行爲,只有當「值」目的是要獲得這樣的領域java.util.Date的實例:

<field xsi:type="xsd:date" name="aDate">2011-10-21</field> 
<field xsi:type="xsd:dateTime" name="aDateTime">2011-10-21T12:00:00</field> 

所以我創建一個適配器,但如果我試試這個:

@XmlElement 
@XmlJavaTypeAdapter(DateAdapter.class) 
Object value; 

的適配器必須處理一個java.lang.Object繼承型

public class DateAdapter extends XmlAdapter<String, Object> {...} 

但我不想失去的所有其他對象的JAXB marshallers(Integer,Double等)...

有一種方法可以爲元素的特定子類型設置適配器嗎?

+0

您是否找到任何解決方案? – nhylated

+0

沒有......我有一個適配器,它處理Object類並在內部管理每個子類型。不是「好」,但它的工作原理。 – ggarciao

回答

-1

嘗試

http://jaxb.java.net/guide/Mapping_interfaces.html#Use__XmlJavaTypeAdapter

的接口XmlJavaTypeAdapter有多種實現

+1

-1你看過這個問題嗎?我確實實現了一個'XmlAdapter ',但是由於我放棄了'Integer,Double等'的適配器。我想要的是保留這些適配器,顯然如果我使用適配器作爲對象,更容易的事情就是生成一個'xsi:anyType',但這正是我不想要的。 – ggarciao

+0

關於您的「多個實現」解決方案,這意味着我必須處理和適配Object,併爲每個對象子類實現一個包裝來生成正確的'xsi:type'。再一次,在這裏我放棄了我想要保留的適配器。 – ggarciao

0

我遇到類似的情況,但我是從正在添加XSD,並從那裏產生的類。也就是說,解決方案應該可以轉置給你。

在我的情況下,我希望擴展XSD模型中簡單字符串的用法,使其在Java代碼中作爲UUID出現,然後在另一個地方以另一個類的形式出現,等等。 XML方面,它的所有字符串(xs:字符串),所以如何將所有這些字符串分爲不同類型的java端...

我所做的是,在XSD中,我爲每個案例創建了簡單類型, UUID聲明:徘徊無論需要

,並使用此而不是字符串。

然後我創建了一個綁定文件,我指定了我的XmlAdaptors,就像你現在做的一樣,除了現在我有單獨的目標,因此可以使用專門針對每個xml「types」的多個適配器。

現在,您還有一個額外的困難,就是在Java端,您的字段的表示只是一個對象。我想你一旦知道了type屬性就會拋出它。也許爲每個案例創建一個字段的子類,這將允許您更改類型ADaptor聲明。