35.2. 属性

概述

Apache CXF 支持在 complexType 元素范围内使用 属性元素和属性组 元素。在为 XML 文档属性声明定义结构时,提供了添加标签内指定的信息的方法,而不是标签包含的值。例如,在 XML 架构中描述 XML 元素 <value currency ="euro">410<\value> 时,使用 例 35.5 “XML 架构定义和属性” 所示的属性元素进行描述。

attributeGroup 元素允许您定义一组可重复使用的属性,这些属性可由架构定义的所有复杂类型引用。例如,如果您要定义一系列使用属性类别和 pubDate 的元素,您可以定义一个包含这些属性的属性组,并在所有使用该属性的元素中引用它们。这在 例 35.7 “属性组定义” 中显示。

当描述用于开发应用程序逻辑中的数据类型时,使用 属性将其设置为 可选所需的属性 被视为结构的元素。对于复杂类型描述中包含的每个属性声明,在 属性的类中生成一个元素,以及适当的 getter 和 setter 方法。

在 XML 架构中定义属性

XML Schema 属性 元素具有一个必需属性,名称,用于识别属性。它还有四个可选属性,如 表 35.2 “用于定义 XML 架构中的属性的可选属性” 所述。

表 35.2. 用于定义 XML 架构中的属性的可选属性

属性描述

使用

指定是否需要属性。有效值 是必需的可选或禁止 使用。可选 是默认值。

type

指定属性可以获取的值类型。如果不使用的模式类型,则必须在命令行中定义属性。

default

指定用于属性的默认值。它仅在 属性 元素的 use 属性设置为 可选 时使用。

fixed

指定用于属性的固定值。它仅在 属性 元素的 use 属性设置为 可选 时使用。

例 35.5 “XML 架构定义和属性” 显示定义属性货币的属性元素,其值是字符串。

例 35.5. XML 架构定义和属性

<element name="value">
  <complexType>
    <xsd:simpleContent>
      <xsd:extension base="xsd:integer">
        <xsd:attribute name="currency" type="xsd:string"
                       use="required"/>
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>
</xsd:element>

如果 attribute 元素中省略了 type 属性,则数据的格式必须按行描述。例 35.6 “带有内数据描述的属性” 显示属性、类别属性 元素,它可以取 autobiography 虚构值或虚构

例 35.6. 带有内数据描述的属性

<attribute name="category" use="required">
  <simpleType>
    <restriction base="xsd:string">
      <enumeration value="autobiography"/>
      <enumeration value="non-fiction"/>
      <enumeration value="fiction"/>
    </restriction>
  </simpleType>
</attribute>

在 XML 架构中使用属性组

在复杂类型定义中使用属性组分为两个步骤:

  1. 定义 属性组。

    使用带有多个属性子元素的 attributeGroup 元素来定义 属性 组。attributeGroup 需要一个 name 属性,用于定义用于引用该属性组的字符串。属性 元素定义属性组的成员,并指定为 “在 XML 架构中定义属性”一节 所示。例 35.7 “属性组定义” 显示属性组 catalogIndecies 的描述。该属性组有两个成员: 类别 (可选)和 pubDate (需要)。

    例 35.7. 属性组定义

    <attributeGroup name="catalogIndices">
      <attribute name="category" type="catagoryType" />
      <attribute name="pubDate" type="dateTime"
                 use="required" />
    </attributeGroup>
  2. 在复杂类型的定义中使用 属性组。

    您可以将 attributeGroup 元素用于 ref 属性,在复杂的类型定义中使用属性组。ref 属性的值是赋予您要用作类型定义一部分的属性组的名称。例如,如果要在复杂类型 dvdType 中使用属性组 catalogIndecies,您可以使用 <attributeGroup ref="catalogIndecies" />,如 例 35.8 “带有属性组的复杂类型” 所示。

    例 35.8. 带有属性组的复杂类型

    <complexType name="dvdType">
      <sequence>
        <element name="title" type="xsd:string" />
        <element name="director" type="xsd:string" />
        <element name="numCopies" type="xsd:int" />
      </sequence>
      <attributeGroup ref="catalogIndices" />
    </complexType>

将属性映射到 Java

属性映射到 Java,其成员元素的工作方式与映射到 Java 的方式相同。必要属性和可选属性映射到所生成的 Java 类中的成员变量。member 变量使用 @XmlAttribute 注释进行解码。如果需要 属性,则 @XmlAttribute 注释的 required 属性设置为 true

例 35.9 “techdoc Description” 中定义的复杂类型映射到 例 35.10 “techdoc Java Class” 中显示的 Java 类。

例 35.9. techdoc Description

<complexType name="techDoc">
  <all>
    <element name="product" type="xsd:string" />
    <element name="version" type="xsd:short" />
  </all>
  <attribute name="usefullness" type="xsd:float"
             use="optional" default="0.01" />
</complexType>

例 35.10. techdoc Java Class

@XmlType(name = "techDoc", propOrder = {

})
public class TechDoc {

    @XmlElement(required = true)
    protected String product;
    protected short version;
    @XmlAttribute protected Float usefullness;

    public String getProduct() {
        return product;
    }

    public void setProduct(String value) {
        this.product = value;
    }

    public short getVersion() {
        return version;
    }

    public void setVersion(short value) {
        this.version = value;
    }

    public float getUsefullness() { if (usefullness == null) { return 0.01F; } else { return usefullness; } }

    public void setUsefullness(Float value) {
        this.usefullness = value;
    }
}

例 35.10 “techdoc Java Class” 所示,default 属性和 固定 属性指示代码生成器将代码添加到为属性生成的 getter 方法中。此附加代码确保了如果没有设置值,则返回指定的值。

重要

fixed 属性处理与 default 属性相同。如果您希望 固定 属性被视为 Java 常量,您可以使用 第 38.5 节 “自定义修复的值属性映射” 中描述的自定义。

将属性组映射到 Java

属性组映射到 Java,就像在类型定义中明确使用组的成员一样。如果该属性组有三个成员,并且它用于复杂类型,则该类型的生成的类将包括 member 变量,以及 getter 和 setter 方法,用于属性组的每个成员。例如: 例 35.8 “带有属性组的复杂类型” 中定义的复杂类型,Apache CXF 生成包含成员变量类别和 pubDate 的类,以支持属性组的成员,如 例 35.11 “dvdType Java Class” 所示。

例 35.11. dvdType Java Class

@XmlType(name = "dvdType", propOrder = {
    "title",
    "director",
    "numCopies"
})
public class DvdType {

    @XmlElement(required = true)
    protected String title;
    @XmlElement(required = true)
    protected String director;
    protected int numCopies;
    @XmlAttribute protected CatagoryType category; @XmlAttribute(required = true) @XmlSchemaType(name = "dateTime") protected XMLGregorianCalendar pubDate;

    public String getTitle() {
        return title;
    }

    public void setTitle(String value) {
        this.title = value;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String value) {
        this.director = value;
    }

    public int getNumCopies() {
        return numCopies;
    }

    public void setNumCopies(int value) {
        this.numCopies = value;
    }

    public CatagoryType getCatagory() {
        return catagory;
    }

    public void setCatagory(CatagoryType value) {
        this.catagory = value;
    }

    public XMLGregorianCalendar getPubDate() {
        return pubDate;
    }

    public void setPubDate(XMLGregorianCalendar value) {
        this.pubDate = value;
    }

}