BoundType
- JAXB不知道如何处理的类型。
写入适配器以允许这种类型通过ValueType用作内存中的表示 。
ValueType
- JAXB知道如何处理开箱即用的类型。
public abstract class XmlAdapter<ValueType,BoundType> extends Object
用法:
某些Java类型不会自然映射到XML表示,例如HashMap或其他非JavaBean类。 相反,XML表示可以映射到Java类型,但是应用程序可以选择使用另一种Java类型访问XML表示。 例如,Java绑定规则的模式将Xs:DateTime默认绑定到XmlGregorianCalendar。 但是,应用程序可能希望将xs:DateTime绑定到自定义类型,例如MyXmlGregorianCalendar。 在这两种情况下,应用程序访问XML内容的绑定类型与映射到XML表示形式的值类型之间存在不匹配。
这个抽象类定义了将绑定类型适配为值类型的方法,反之亦然。 在编组和解组时,这些方法由JAXB绑定框架调用:
XmlJavaTypeAdapter
安装适配器 示例:HashMap定制映射
下面的例子说明了如何使用@XmlAdapter和@XmlJavaTypeAdapter定制HashMap的映射。
步骤1:确定HashMap所需的XML表示形式。
<hashmap>
<entry key="id123">this is a value</entry>
<entry key="id312">this is another value</entry>
...
</hashmap>
步骤2:确定上面显示的所需XML表示方式应遵循的模式定义。
<xs:complexType name="myHashMapType">
<xs:sequence>
<xs:element name="entry" type="myHashMapEntryType"
minOccurs = "0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="myHashMapEntryType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="key" type="xs:int"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
步骤3:编写可以生成上述模式定义的值类型。
public class MyHashMapType {
List<MyHashMapEntryType> entry;
}
public class MyHashMapEntryType {
@XmlAttribute
public Integer key;
@XmlValue
public String value;
}
步骤4:将适配器的值类型MyHashMapType写入应用程序使用的绑定类型HashMap。
public final class MyHashMapAdapter extends
XmlAdapter<MyHashMapType,HashMap> { ... }
步骤5:使用适配器。
public class Foo {
@XmlJavaTypeAdapter(MyHashMapAdapter.class)
HashMap hashmap;
...
}
上述代码片段将映射到以下模式:
<xs:complexType name="Foo">
<xs:sequence>
<xs:element name="hashmap" type="myHashMapType"
</xs:sequence>
</xs:complexType>
XmlJavaTypeAdapter