javax.xml.bind.annotation.adapters

注释
java.lang.Object
  继承者 javax.xml.bind.annotation.adapters.XmlAdapter<ValueType,BoundType>
类型参数:
BoundType - JAXB 不知道如何处理的一些类型。编写一个适配器,以便允许通过 ValueType 将此类型用作内存表示形式。
ValueType - JAXB 无需其他操作便知道如何处理的类型。
直接已知子类:
CollapsedStringAdapter, HexBinaryAdapter, NormalizedStringAdapter

public abstract class XmlAdapter<ValueType,BoundType>
     
extends Object

修改 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 绑定框架调用这些方法:

  • XmlAdapter.marshal(...):编组过程中,JAXB 绑定框架调用 XmlAdapter.marshal(..) 将 bound 类型修改为 value 类型,然后将 value 类型编组为 XML 表示形式。
  • XmlAdapter.unmarshal(...):解组过程中,JAXB 绑定框架首先将 XML 表示形式解组为 value 类型,然后调用 XmlAdapter.unmarshal(..) 将 value 类型修改为 bound 类型。
因此编写一个适配器涉及以下步骤:
  • 编写实现此抽象类的适配器。
  • 安装使用注释 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>
 

从以下版本开始:
JAXB 2.0
另请参见:
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
 

构造方法详细信息

XmlAdapter

protected XmlAdapter()
派生类的构造方法,不执行任何操作。

方法详细信息

unmarshal

public abstract BoundType unmarshal(ValueType v)
                             throws Exception
将 value 类型转换为 bound 类型。

参数:
v - 要转换的值。可以为 null。
抛出:
Exception - 如果在转换过程中发生错误。调用者通过 ValidationEventHandler 负责向用户报告错误。

marshal

public abstract ValueType marshal(BoundType v)
                           throws Exception
将 bound 类型转换为 value 类型。

参数:
v - 要转换的值。可以为 null。
抛出:
Exception - 如果在转换过程中发生错误。调用者通过 ValidationEventHandler 负责向用户报告错误。