JAXB - 仅为元素的特定子类型设置XmlAdapter?

时间:2011-10-26 08:22:15

标签: xml xml-serialization jaxb

我必须生成一个xml元素,它可以具有任何“基本类型”的值(xsd:string,xsd:boolean等)。例子:

<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 ...

现在我想改变marshaller的行为,当'value'对象是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 ......

有一种方法可以为元素的特定子类型设置适配器吗?

2 个答案:

答案 0 :(得分:0)

虽然我从XSD出来并从那里生成类,但我遇到了类似的情况。也就是说,解决方案也应该转移给你。

在我的情况下,我想在XSD模型中扩展一个简单String的使用,以便它在Java代码中作为UUID出现,然后另一个在其他地方作为类出现,依此类推。 XML方面,它都是字符串(xs:string),所以如何将所有这些字符串分成不同类型的java方...

我结束的是,在XSD中我为每种情况创建了简单类型,这里是UUID声明:                                         

并使用此代替字符串。

然后我创建了一个绑定文件,我指定了我的XmlAdaptors,就像你做的那样,除了现在我有单独的目标,因此可以使用多个专门针对每个xml&#34;类型&#34;的适配器。

现在,你有一个额外的困难,就是在Java方面,你的字段的表示只是一个对象。我想你一旦知道了type属性就会抛出它。也许为每种情况创建一个字段的子类,这将允许您更改typeADaptor声明。

答案 1 :(得分:-1)

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

XmlJavaTypeAdapter用于具有多个实现的接口