Module  java.xml.bind

Class XmlAdapter<ValueType,BoundType>

  • 参数类型
    BoundType - JAXB不知道如何处理的类型。 写入适配器以允许此类型通过ValueType用作内存中的表示ValueType
    ValueType - JAXB知道如何处理开箱即用的类型。
    已知直接子类:
    CollapsedStringAdapterHexBinaryAdapterNormalizedStringAdapter


    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内容的绑定类型与映射到XML表示形式的值类型之间存在不匹配。

    这个抽象类定义了将绑定类型适配为值类型的方法,反之亦然。 在编组和解组时,这些方法由JAXB绑定框架调用:

    • XmlAdapter.marshal(...):在编组期间,JAXB绑定框架调用XmlAdapter.marshal(..)以将绑定类型修改为值类型,然后将其编组为XML表示。
    • XmlAdapter.unmarshal(...):在解组时,JAXB绑定框架首先将XML表示解组为值类型,然后调用XmlAdapter.unmarshal(..)以将值类型适配为绑定类型。
    因此,编写适配器涉及以下步骤:
    • 编写一个实现这个抽象类的适配器。
    • 使用注释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>  
    从以下版本开始:
    1.6,JAXB 2.0
    另请参见:
    XmlJavaTypeAdapter
    • 构造方法详细信息

      • XmlAdapter

        protected XmlAdapter​()
        派生类的Do-nothing构造函数。
    • 方法详细信息

      • unmarshal

        public abstract BoundType unmarshal​(ValueType v)
                                     throws 异常
        将值类型转换为绑定类型。
        参数
        v - 要转换的值。 可以为null。
        异常
        异常 - 转换过程中是否有错误。 来电者负责通过ValidationEventHandler向用户报告错误。
      • marshal

        public abstract ValueType marshal​(BoundType v)
                                   throws 异常
        将绑定类型转换为值类型。
        参数
        v - 要v的值。 可以为null。
        异常
        异常 - 转换过程中是否有错误。 来电者负责通过ValidationEventHandler向用户报告错误。