35.2. 속성

35.2.1. 개요

Apache CXF는 complexType 요소의 범위 내에서 속성 요소 및 attribute Group 요소의 사용을 지원합니다. XML 문서 특성 선언에 대한 구조를 정의할 때 태그 내에서 지정된 정보를 태그에 포함하는 값이 아닌 추가 수단을 제공합니다. 예를 들어 XML 스키마에서 XML 요소 <valuecurrency="euro">410<\value>를 설명하는 경우 통화 속성은 예 35.5. “XML 스키마 정의 및 속성” 에 표시된 대로 특성 요소를 사용하여 설명합니다.

attributeGroup 요소를 사용하면 스키마에서 정의한 모든 복잡한 유형에서 참조할 수 있는 재사용 가능한 속성 그룹을 정의할 수 있습니다. 예를 들어 모두 특성 categorypubDate 를 사용하는 일련의 요소를 정의하는 경우 이러한 특성을 사용하여 특성 그룹을 정의하고 이를 사용하는 모든 요소에서 참조할 수 있습니다. 이는 예 35.7. “특성 그룹 정의” 에 표시됩니다.

애플리케이션 논리 개발에 사용할 데이터 유형을 설명하는 경우 use 특성이 선택 사항으로 설정되거나 필수 로 설정된 속성은 구조의 요소로 처리됩니다. 복잡한 형식 설명에 포함된 각 특성 선언에 대해 적절한 getter 및 setter 메서드와 함께 속성에 대한 클래스에서 요소가 생성됩니다.

35.2.2. XML 스키마에서 속성 정의

XML Schema 특성 요소에는 특성을 식별하는 데 사용되는 하나의 필수 특성인 name 이 있습니다. 또한 표 35.2. “XML 스키마에서 특성을 정의하는 데 사용되는 선택적 속성” 에 설명된 4개의 선택적 속성이 있습니다.

표 35.2. XML 스키마에서 특성을 정의하는 데 사용되는 선택적 속성

속성설명

사용

속성이 필요한지 여부를 지정합니다. 유효한 값은 필수 값,선택 사항 또는 금지입니다. 선택 사항이 기본값입니다.

type

특성에서 사용할 수 있는 값의 유형을 지정합니다. 사용하지 않는 경우 속성의 스키마 유형을 행으로 정의해야 합니다.

default

속성에 사용할 기본값을 지정합니다. 특성 요소의 use 속성이 선택 사항으로 설정된 경우에만 사용됩니다.

수정됨

속성에 사용할 고정 값을 지정합니다. 특성 요소의 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>

type 속성이 특성 요소에서 생략된 경우 데이터 형식을 인라인으로 설명해야 합니다. 예 35.6. “인라인 데이터 설명이 있는 속성” autobiography,non-fiction 또는 fiction 값을 사용할 수 있는 속성, 카테고리 의 특성 요소를 표시합니다.

예 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>

35.2.3. XML 스키마에서 특성 그룹 사용

복잡한 유형 정의에서 특성 그룹을 사용하는 작업은 다음 두 단계로 구성됩니다.

  1. 특성 그룹을 정의합니다.

    특성 그룹은 여러 특성 하위 요소가 있는 attribute Group 요소를 사용하여 정의됩니다. attributeGroup 에는 특성 그룹을 참조하는 데 사용되는 문자열을 정의하는 name 속성이 필요합니다. 특성 요소는 특성 그룹의 멤버를 정의하고 “XML 스키마에서 속성 정의” 에 표시된 대로 지정됩니다. 예 35.7. “특성 그룹 정의” 속성 그룹 catalogIndecies 에 대한 설명을 표시합니다. 특성 그룹에는 두 개의 멤버가 있습니다. category, which is optional, and pubDate, which is required.

    예 35.7. 특성 그룹 정의

    <attributeGroup name="catalogIndices">
      <attribute name="category" type="catagoryType" />
      <attribute name="pubDate" type="dateTime"
                 use="required" />
    </attributeGroup>
  2. 특성 그룹을 복잡한 유형의 정의에 사용합니다.

    ref 속성과 함께 attributeGroup 요소를 사용하여 복잡한 유형 정의에서 특성 그룹을 사용합니다. ref 속성의 값은 형식 정의의 일부로 사용할 특성 그룹이 지정된 이름입니다. 예를 들어 복잡한 유형 dvdType 에서 특성 group catalogIndecies 를 사용하려면 예 35.8. “특성 그룹을 사용하는 복잡한 유형” 에 표시된 대로 <attributeGroup ref="catalogIndecies" />를 사용합니다.

    예 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>

35.2.4. 속성을 Java에 매핑

속성은 멤버 요소가 Java에 매핑되는 것과 거의 동일한 방식으로 Java에 매핑됩니다. 필수 특성 및 선택적 속성은 생성된 Java 클래스에서 멤버 변수에 매핑됩니다. 멤버 변수는 @ CryostatAttribute 주석으로 데코레이팅됩니다. 속성이 필요한 경우 @ CryostatAttribute 주석의 required 속성이 true 로 설정됩니다.

예 35.9. “techdoc 설명” 에 정의된 복잡한 유형은 예 35.10. “techDoc Java Class” 에 표시된 Java 클래스에 매핑됩니다.

예 35.9. techdoc 설명

<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” 에 표시된 대로 기본 속성 및 고정 속성은 코드 생성기가 속성에 대해 생성된 getter 메서드에 코드를 추가하도록 지시합니다. 이 추가 코드를 사용하면 값이 설정되지 않은 경우 지정된 값이 반환됩니다.

중요

고정 속성은 default 속성과 동일하게 취급됩니다. 고정 속성을 Java 상수로 처리하려면 38.5절. “고정 값 속성 매핑 사용자 정의” 에 설명된 사용자 지정을 사용할 수 있습니다.

35.2.5. 특성 그룹을 Java에 매핑

특성 그룹은 그룹 멤버가 유형 정의에 명시적으로 사용된 것처럼 Java에 매핑됩니다. 특성 그룹에 세 개의 멤버가 있고 복잡한 형식에 사용되는 경우 해당 유형에 대해 생성된 클래스에는 특성 그룹의 각 멤버에 대해 getter 및 setter 메서드와 함께 멤버 변수가 포함됩니다. 예를 들어 예 35.8. “특성 그룹을 사용하는 복잡한 유형” 에 정의된 복잡한 유형은 Apache CXF에서 멤버 변수 categorypubDate 를 포함하는 클래스를 생성하여 예 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;
    }

}