33장. XML Cryostat 사용
초록
XML 스키마 요소는 XML 문서에서 요소의 인스턴스를 정의하는 데 사용됩니다. 요소는 XML 스키마 문서의 전역 범위에서 정의되거나 복잡한 유형의 멤버로 정의됩니다. 전역 범위에 정의되면 Apache CXF는 이를 보다 쉽게 조작할 수 있도록 하는 element 클래스에 매핑됩니다.
33.1. 개요
XML 문서의 요소 인스턴스는 XML 스키마 문서의 전역 범위에 있는 XML 스키마 요소
요소에 의해 정의되므로 Java 개발자가 요소에서 더 쉽게 작업할 수 있도록 Apache CXF는 전역적으로 범위가 지정된 요소를 특수 CryostatB 요소 클래스 또는 해당 콘텐츠 유형과 일치하도록 생성된 Java 클래스에 매핑됩니다.
요소 매핑 방법은 type 속성에서 참조하는 명명된 형식을 사용하거나 요소가 인라인 형식 정의를 사용하여 정의되는지에 따라 달라집니다.How the element is mapped depends on if the element is defined using a named type
referenced by the type attribute or if the element is defined using an in-line type definition. 인라인 유형 정의로 정의된 요소는 Java 클래스에 매핑됩니다.
스키마의 다른 요소에서 인라인 유형을 재사용할 수 없기 때문에 이름이 지정된 형식을 사용하여 요소를 정의하는 것이 좋습니다.
33.2. XML 스키마 매핑
XML 스키마 요소에서는 요소 요소를
사용하여 정의됩니다. 요소
요소에는 하나의 필수 특성이 있습니다. name
은 XML 문서에 표시되는 대로 요소의 이름을 지정합니다.
name
특성 요소 요소
외에도 표 33.1. “요소를 정의하는 데 사용되는 속성” 에 나열된 선택적 속성이 있습니다.
속성 | 설명 |
---|---|
| 요소의 형식을 지정합니다. 유형은 모든 XML 스키마 기본 유형 또는 계약에 정의된 이름이 지정된 복잡한 유형일 수 있습니다. 이 속성을 지정하지 않으면 인라인 유형 정의를 포함해야 합니다. |
|
요소에서 요소를 완전히 제외할 수 있는지 여부를 지정합니다. |
|
인스턴스 문서에서 요소를 사용할 수 있는지 여부를 지정합니다. |
| 이 요소로 대체할 수 있는 요소의 이름을 지정합니다. 유형 대체 사용에 대한 자세한 내용은 37장. 요소 하위 항목 을 참조하십시오. |
| 요소의 기본값을 지정합니다. 이 특성을 코드 생성에 미치는 방법에 대한 자세한 내용은 “기본값을 사용하여 요소의 Java 매핑” 을 참조하십시오. |
| 요소의 고정 값을 지정합니다. |
예 33.1. “간단한 XML 스키마 요소 정의” 간단한 요소 정의를 표시합니다.
예 33.1. 간단한 XML 스키마 요소 정의
<element name="joeFred" type="xsd:string" />
또한 요소는 인라인 유형 정의를 사용하여 자체 유형을 정의할 수도 있습니다. 인라인 유형은 complexType
요소 또는 simpleType
요소를 사용하여 지정됩니다. 데이터 유형이 복잡하거나 간단한지 여부를 지정하면 각 데이터 유형에 사용할 수 있는 도구를 사용하여 필요한 모든 유형의 데이터를 정의할 수 있습니다.
예 33.2. “인라인 유형을 사용한 XML 스키마 요소 정의” 인라인 유형 정의를 사용하여 요소 정의를 표시합니다.
예 33.2. 인라인 유형을 사용한 XML 스키마 요소 정의
<element name="skate"> <complexType> <sequence> <element name="numWheels" type="xsd:int" /> <element name="brand" type="xsd:string" /> </sequence> </complexType> </element>
33.3. 이름이 지정된 유형이 있는 요소의 Java 매핑
기본적으로 전역적으로 정의된 요소는 템플릿 클래스가 요소
요소의
type
속성 값에 따라 결정됩니다. 기본 유형의 경우 템플릿 클래스는 “래퍼 클래스” 에 설명된 래퍼 클래스 매핑을 사용하여 파생됩니다. 복잡한 유형의 경우 복잡한 유형을 지원하기 위해 생성된 Java 클래스는 템플릿 클래스로 사용됩니다.
매핑을 지원하고 요소의 QName에 대한 불필요한 걱정을 완화하기 위해 예 33.3. “글로벌 범위 요소를 위한 Object Cryostat 방법” 와 같이 전역적으로 정의된 각 요소에 대해 오브젝트 팩토리 방법이 생성됩니다.
예 33.3. 글로벌 범위 요소를 위한 Object Cryostat 방법
public class ObjectFactory { private final static QName _name_QNAME = new QName("targetNamespace", "localName"); ... @XmlElementDecl(namespace = "targetNamespace", name = "localName") public JAXBElement<type> createname(type value); }
예를 들어 예 33.1. “간단한 XML 스키마 요소 정의” 에 정의된 요소는 예 33.4. “간단한 요소를 위한 Object Cryostat” 에 표시된 오브젝트 팩토리 메서드를 생성합니다.
예 33.4. 간단한 요소를 위한 Object Cryostat
public class ObjectFactory { private final static QName _JoeFred_QNAME = new QName("...", "joeFred"); ... @XmlElementDecl(namespace = "...", name = "joeFred") public JAXBElement<String> createJoeFred(String value); }
예 33.5. “글로벌 범위 요소 사용” Java에서 전역 범위 요소를 사용하는 예를 보여줍니다.
예 33.5. 글로벌 범위 요소 사용
JAXBElement<String> element = createJoeFred("Green"); String color = element.getValue();
33.4. WSDL에서 이름이 지정된 형식으로 요소 사용
전역 범위 요소가 메시지 부분을 정의하는 데 사용되는 경우 생성된 Java 매개변수는 Cryostat B Cryostat<T>의 인스턴스가 아닙니다
. 대신 일반 Java 유형 또는 클래스에 매핑됩니다.
예 33.6. “Element를 메시지 부분으로 사용” 에 표시된 WSDL 조각에 따라 결과 메서드에는 문자열
유형의 매개변수가 있습니다.
예 33.6. Element를 메시지 부분으로 사용
<?xml version="1.0" encoding=";UTF-8"?> <wsdl:definitions name="HelloWorld" targetNamespace="http://apache.org/hello_world_soap_http" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://apache.org/hello_world_soap_http" xmlns:x1="http://apache.org/hello_world_soap_http/types" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema targetNamespace="http://apache.org/hello_world_soap_http/types" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"><element name="sayHi"> <element name="sayHi" type="string"/> <element name="sayHiResponse" type="string"/> </schema> </wsdl:types> <wsdl:message name="sayHiRequest"> <wsdl:part element="x1:sayHi" name="in"/> </wsdl:message> <wsdl:message name="sayHiResponse"> <wsdl:part element="x1:sayHiResponse" name="out"/> </wsdl:message> <wsdl:portType name="Greeter"> <wsdl:operation name="sayHi"> <wsdl:input message="tns:sayHiRequest" name="sayHiRequest"/> <wsdl:output message="tns:sayHiResponse" name="sayHiResponse"/> </wsdl:operation> </wsdl:portType> ... </wsdl:definitions>
예 33.7. “글로벌 요소를 일부로 사용하는 Java 방법” sayHi
작업에 대해 생성된 메서드 서명을 표시합니다.
예 33.7. 글로벌 요소를 일부로 사용하는 Java 방법
String
sayHi
String
in
33.5. 인라인 유형으로 요소의 Java 매핑
인라인 유형을 사용하여 요소를 정의하면 다른 유형을 Java에 매핑하는 데 사용되는 것과 동일한 규칙에 따라 Java에 매핑됩니다. 간단한 유형의 규칙은 34장. 간단한 유형 사용 에 설명되어 있습니다. 복잡한 유형의 규칙은 35장. 복잡한 유형 사용 에 설명되어 있습니다.
인라인 유형 정의가 있는 요소에 대해 Java 클래스가 생성되면 생성된 클래스는 @ CryostatRoot
Cryostat 주석으로 장식됩니다. @ CryostatRoot Cryostat
주석에는 name
및 namespace
라는 두 가지 유용한 속성이 있습니다. 이러한 속성은 표 33.2. “@ CryostatRoot Cryostat 주석에 대한 속성” 에 설명되어 있습니다.
속성 | 설명 |
---|---|
|
XML Schema |
| 요소가 정의된 네임스페이스를 지정합니다. 이 요소가 대상 네임스페이스에 정의되어 있으면 속성이 지정되지 않습니다. |
요소가 다음 조건 중 하나 이상을 충족하는 경우 @ CryostatRoot
Cryostat 주석은 사용되지 않습니다.
-
요소의
nillable
속성이true
로 설정됩니다. 요소는 대체 그룹의 헤드 요소입니다.
대체 그룹에 대한 자세한 내용은 37장. 요소 하위 항목 을 참조하십시오.
33.6. 추상 요소의 Java 매핑
요소의 abstract
속성이 true
로 설정되면 형식의 인스턴스를 인스턴스화하는 개체 팩토리 메서드가 생성되지 않습니다. 인라인 유형을 사용하여 요소를 정의하면 인라인 유형을 지원하는 Java 클래스가 생성됩니다.
33.7. 기본값을 사용하여 요소의 Java 매핑
요소의 기본
특성이 사용되는 경우 defaultValue
속성은 생성된 @ CryostatDecl 주석에
추가됩니다. 예를 들어 예 33.8. “기본 값이 있는 XML 스키마 요소” 에 정의된 요소는 예 33.9. “Object Cryostat Method for an Element with a Default Value” 에 표시된 오브젝트 팩토리 메서드를 생성합니다.
예 33.8. 기본 값이 있는 XML 스키마 요소
<element name="size" type="xsd:int" default="7"/>
예 33.9. Object Cryostat Method for an Element with a Default Value
@XmlElementDecl(namespace = "...", name = "size", defaultValue = "7")
public JAXBElement<Integer> createUnionJoe(Integer value) {
return new JAXBElement<Integer>(_Size_QNAME, Integer.class, null, value);
}