java.lang.Object javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>
BoundType
- JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过
ValueType 将此类型用作内存表示形式。
ValueType
- JAXB 无需其他操作便知道如何处理的类型。
public abstract class XmlAdapter<ValueType,BoundType>
修改 Java 类型以适应自定义编组。
用法:
一些 Java 类型不能自然映射到 XML 表示形式,例如,HashMap 或其他非 JavaBean 类。反之,XML 表示形式可以映射到 Java 类型,但是应用程序可能会选择使用另一种 Java 类型访问 XML 表示形式。例如,默认情况下,Java 绑定规则模式将 xs:DateTime 绑定到 XmlGregorianCalendar。但应用程序可能需要将 xs:DateTime 绑定到自定义类型,例如 MyXmlGregorianCalendar。在这两种情况下,应用程序用来访问 XML 内容的 bound 类型 与映射到 XML 表示形式的 value 类型 不匹配。
此抽象类定义将 bound 类型修改为 value 类型或将 value 类型修改为 bound 类型的方法。在编组或解组过程中,由 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:编写能够生成上述模式定义的 value 类型。
public class MyHashMapType { List<MyHashMapEntryType> entry; } public class MyHashMapEntryType { @XmlAttribute public Integer key; @XmlValue public String value; }
步骤 4:编写将 value 类型 (MyHashMapType) 修改为 bound 类型(应用程序使用的 HashMap)的适配器。
public final class MyHashMapAdapter extends XmlAdapter<HashMap, MyHashMapType> { ... }
步骤 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
构造方法摘要 | |
---|---|
protected |
XmlAdapter() 派生类的构造方法,不执行任何操作。 |
方法摘要 | |
---|---|
abstract ValueType |
marshal(BoundType v) 将 bound 类型转换为 value 类型。 |
abstract BoundType |
unmarshal(ValueType v) 将 value 类型转换为 bound 类型。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造方法详细信息 |
---|
protected XmlAdapter()
方法详细信息 |
---|
public abstract BoundType unmarshal(ValueType v) throws Exception
v
- 要转换的值。可以为 null。
Exception
- 如果在转换过程中发生错误。调用者通过
ValidationEventHandler
负责向用户报告错误。
public abstract ValueType marshal(BoundType v) throws Exception
v
- 要转换的值。可以为 null。
Exception
- 如果在转换过程中发生错误。调用者通过
ValidationEventHandler
负责向用户报告错误。