我必须生成一个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 ......
有一种方法可以为元素的特定子类型设置适配器吗?
答案 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用于具有多个实现的接口