36.2. XML 스키마 anyType 유형 사용
36.2.1. 개요
XML Schema 유형 xsd:anyType
은 모든 XML 스키마 유형의 루트 유형입니다. 모든 프리미티브는 사용자 정의 복잡한 유형과 마찬가지로 이 유형의 파생물입니다. 결과적으로 xsd:anyType
으로 정의된 요소는 스키마 문서에 정의된 복잡한 유형뿐만 아니라 XML 스키마 기본 형식 형식으로 데이터를 포함할 수 있습니다.As a result, elements defined as being of xsd:anyType can contain data in the form of any of the XML Schema primitives as well as any complex type defined in a schema document.
Java에서 가장 가까운 유형은 Object
클래스입니다. 다른 모든 Java 클래스가 하위 형식의 클래스입니다.
36.2.2. XML 스키마로 사용
다른 XML 스키마 복잡한 형식과 마찬가지로 xsd:anyType
을 사용합니다. 요소 요소의 형식 값으로 사용할 수 있습니다.It can be used as the value of an element
's type
element. 다른 유형이 정의된 기본 유형으로도 사용할 수 있습니다.
예 36.5. “와일드 카드 요소가 있는 복합 유형” xsd:anyType
형식의 요소를 포함하는 복잡한 형식의 예를 보여줍니다.
예 36.5. 와일드 카드 요소가 있는 복합 유형
<complexType name="wildStar">
<sequence>
<element name="name" type="xsd:string" />
<element name="ship" type="xsd:anyType" />
</sequence>
</complexType>
36.2.3. Java로의 매핑
xsd:anyType
유형의 요소는 Object
오브젝트에 매핑됩니다. 예 36.6. “와일드 카드 요소 설명 Java Representation of a Wild Card Element” 에서 예 36.5. “와일드 카드 요소가 있는 복합 유형” 의 매핑을 Java 클래스에 표시합니다.
예 36.6. 와일드 카드 요소 설명 Java Representation of a Wild Card Element
public class WildStar { @XmlElement(required = true) protected String name; @XmlElement(required = true) protected Object ship; public String getName() { return name; } public void setName(String value) { this.name = value; } public Object getShip() { return ship; } public void setShip(Object value) { this.ship = value; } }
이 매핑을 사용하면 와일드카드 요소를 나타내는 속성에 데이터를 배치할 수 있습니다. Apache CXF 런타임은 데이터의 마샬링 및 사용 가능한 Java 표현으로 데이터 마샬링을 처리합니다.
36.2.4. 마샬링
Apache CXF가 XML 데이터를 Java 형식으로 마샬링할 때 모든Type
요소를 알려진 JAXB 개체로 마샬링하려고 합니다. anyType
요소를 JAXB 생성된 개체로 마샬링할 수 있는지 확인하려면 런타임에서 요소의 xsi:type
속성을 검사하여 요소에서 데이터를 구성하는 데 사용되는 실제 유형을 결정합니다. xsi:type
속성이 없는 경우 런타임은 인트로스펙션을 통해 요소의 실제 데이터 유형을 식별합니다. 요소의 실제 데이터 형식이 애플리케이션의 JAXB 컨텍스트에서 알려진 유형 중 하나로 확인되면 요소가 적절한 유형의 JAXB 오브젝트로 마샬링됩니다.
런타임이 요소의 실제 데이터 형식을 결정할 수 없거나 요소의 실제 데이터 형식이 알려진 형식이 아닌 경우 런타임은 콘텐츠를 org.w3c.dom.Element 개체로 마샬링합니다.If the runtime cannot determine the actual data type of the element, or the actual data type of the element is not a known type, the runtime marshals the content into a org.w3c.dom.Element
object. 그런 다음 DOM APis를 사용하여 요소의 콘텐츠를 작업해야합니다.
애플리케이션 런타임은 일반적으로 계약 내에 포함된 스키마에서 생성된 모든 유형에 대해 알고 있습니다. 여기에는 계약의 wsdl:types
요소에 정의된 유형, 포함을 통해 계약에 추가된 모든 데이터 유형, 다른 스키마 문서를 가져와서 계약에 추가된 모든 유형이 포함됩니다. 32.4절. “런타임 Marshaller에 클래스 추가” 에서 설명하는 @XmlSeeAlso
주석을 사용하여 런타임에서 추가 유형을 인식할 수도 있습니다.
36.2.5. unmarshalling
Apache CXF가 Java 유형을 XML 데이터로 분리할 때 Java 데이터 유형과 XML 스키마 구문 간의 내부 맵을 사용하여 유선에 쓸 XML 구조를 결정합니다. 런타임에서 클래스를 알고 클래스를 XML 스키마 구문에 매핑할 수 있는 경우 데이터를 작성하고 xsi:type 속성을 삽입하여 요소에 포함된 데이터 유형을 식별합니다.If the runtime knows the class and can map the class to an XML Schema construct, it writes out the data and inserts an xsi:type
attribute to identify the type of data the element contains. 데이터가 org.w3c.dom.Element
개체에 저장된 경우 런타임은 개체에서 나타내는 XML 구조를 기록하지만 xsi:type
속성은 포함하지 않습니다.
런타임에서 Java 개체를 알려진 XML 스키마 구문에 매핑할 수 없는 경우 마샬링 예외가 발생합니다. 32.4절. “런타임 Marshaller에 클래스 추가” 에서 설명하는 @XmlSeeAlso
주석을 사용하여 런타임 맵에 유형을 추가할 수 있습니다.