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 架构中的属性的可选属性
属性 | 描述 |
---|---|
|
指定是否需要属性。有效值 |
| 指定属性可以获取的值类型。如果不使用的模式类型,则必须在命令行中定义属性。 |
|
指定用于属性的默认值。它仅在 |
|
指定用于属性的固定值。它仅在 |
例 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 架构中使用属性组
在复杂类型定义中使用属性组分为两个步骤:
定义 属性组。
使用带有多个属性子元素的
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>
在复杂类型的定义中使用 属性组。
您可以将
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;
}
}