10장. XML 문서 사용

초록

순수 XML 페이로드 형식은 SOAP의 오버헤드 없이 간단한 XML 문서를 사용하여 데이터를 교환할 수 있도록 하여 SOAP 바인딩에 대한 대안을 제공합니다.

10.1. XML 바인딩 네임스페이스

XML 형식 바인딩을 설명하는 데 사용되는 확장 기능은 네임스페이스 http://cxf.apache.org/bindings/xformat 에 정의되어 있습니다. Apache CXF 툴은 xformat 접두사를 사용하여 XML 바인딩 확장을 나타냅니다. 계약에 다음 줄을 추가합니다.Add the following line to your contract:

xmlns:xformat="http://cxf.apache.org/bindings/xformat"

10.2. 수동 편집

인터페이스를 순수 XML 페이로드 형식으로 매핑하려면 다음을 수행합니다.

  1. 네임스페이스 선언을 추가하여 XML 바인딩을 정의하는 확장을 포함합니다. “XML 바인딩 네임스페이스” 을 참조하십시오.
  2. 표준 WSDL 바인딩 요소를 계약에 추가하여 XML 바인딩을 보유하고, 바인딩에 고유한 이름 을 지정한 다음, 바인딩되는 인터페이스를 나타내는 WSDL portType 요소의 이름을 지정합니다.
  3. xformat:binding 하위 요소를 바인딩 요소에 추가하여 메시지가 SOAP 봉투 없이 순수 XML 문서로 처리되는지 확인합니다.
  4. 필요한 경우 xformat:binding 요소의 rootNode 속성을 유효한 QName으로 설정합니다. rootNode 특성의 영향에 대한 자세한 내용은 “글의 XML 메시지” 을 참조하십시오.
  5. 바인딩된 인터페이스에 정의된 각 작업에 대해 작업 메시지에 대한 바인딩 정보를 보유하는 표준 WSDL 작업 요소를 추가합니다.
  6. 바인딩에 추가된 각 작업에 대해 입력 , 출력 및 오류 자식 요소를 추가하여 작업에서 사용하는 메시지를 나타냅니다.For each operation added to the binding, add the input,output, and fault children elements to represent the messages used by the operation.

    이러한 요소는 논리 작업의 인터페이스 정의에 정의된 메시지에 해당합니다.

  7. 선택적으로 유효한 rootNode 속성이 있는 xformat:body 요소를 추가된 입력,출력, fault 요소에 추가하여 바인딩 수준에서 설정된 rootNode 의 값을 재정의합니다.
참고

메시지에 void를 반환하는 작업에 대한 출력 메시지와 같이 어떤 메시지가 아무런 부분도 없는 경우, 전선에 작성된 메시지가 유효한지 확인하도록 메시지의 rootNode 특성을 설정해야 합니다.

10.3. 글의 XML 메시지

인터페이스의 메시지가 SOAP 봉투 없이 XML 문서로 전달되도록 지정하는 경우 메시지가 전선에 기록될 때 유효한 XML 문서를 형성하도록 해야 합니다. 또한 XML 문서를 수신하는 Apache CXF 이외의 사용자가 Apache CXF가 생성한 메시지를 이해하고 있는지 확인해야 합니다.

두 문제를 해결하는 간단한 방법은 글로벌 xformat:binding 요소 또는 개별 메시지의 xformat:body 요소에서 선택적 rootNode 특성을 사용하는 것입니다. rootNode 속성은 Apache CXF에서 생성된 XML 문서에 대한 루트 노드 역할을 하는 요소의 QName을 지정합니다. rootNode 속성이 설정되지 않은 경우 Apache CXF는 doc 스타일 메시지를 사용할 때 메시지 부분의 루트 요소를 루트 요소로 사용하거나 rpc 스타일 메시지를 사용할 때 메시지 파트 이름을 루트 요소로 사용합니다.

예를 들어 rootNode 속성이 예 10.1. “유효한 XML 바인딩 메시지” 에 정의된 메시지를 설정하지 않으면 루트 요소 lineNumber 를 사용하여 XML 문서를 생성합니다.

예 10.1. 유효한 XML 바인딩 메시지

<type ... >
  ...
  <element name="operatorID" type="xsd:int"/>
  ...
</types>
<message name="operator">
  <part name="lineNumber" element="ns1:operatorID"/>
</message>

한 부분이 있는 메시지의 경우, Apache CXF는 rootNode 속성이 설정되지 않은 경우에도 항상 유효한 XML 문서를 생성합니다. 그러나 예 10.2. “잘못된 XML 바인딩 메시지” 의 메시지는 유효하지 않은 XML 문서를 생성합니다.

예 10.2. 잘못된 XML 바인딩 메시지

<types>
  ...
  <element name="pairName" type="xsd:string"/>
  <element name="entryNum" type="xsd:int"/>
  ...
</types>

<message name="matildas">
  <part name="dancing" element="ns1:pairName"/>
  <part name="number" element="ns1:entryNum"/>
</message>

XML 바인딩에 지정된 rootNode 특성이 없으면 Apache CXF는 예 10.2. “잘못된 XML 바인딩 메시지” 로 정의된 메시지에 대해 예 10.3. “잘못된 XML 문서” 와 유사한 XML 문서를 생성합니다. 생성된 XML 문서는 pairNameentryNum 의 두 가지 루트 요소가 있기 때문에 유효하지 않습니다.

예 10.3. 잘못된 XML 문서

<pairName>
  Fred&Linda
</pairName>
<entryNum>
  123
</entryNum>

rootNode 특성을 설정하면 예 10.4. “rootNode 세트가 있는 XML 바인딩” Apache CXF에서 지정된 루트 요소에 요소를 래핑합니다. 이 예제에서 rootNode 특성은 전체 바인딩에 대해 정의되며 루트 요소 이름이 entrants로 지정되도록 지정합니다.

예 10.4. rootNode 세트가 있는 XML 바인딩

<portType name="danceParty">
  <operation name="register">
    <input message="tns:matildas" name="contestant"/>
  </operation>
</portType>

<binding name="matildaXMLBinding" type="tns:dancingMatildas">
  <xmlformat:binding rootNode="entrants"/>
  <operation name="register">
    <input name="contestant"/>
    <output name="entered"/>
</binding>

입력 메시지에서 생성된 XML 문서는 예 10.5. “rootNode 특성을 사용하여 생성된 XML 문서” 과 유사합니다. XML 문서에는 이제 하나의 루트 요소만 있습니다.

예 10.5. rootNode 특성을 사용하여 생성된 XML 문서

<entrants>
  <pairName>
    Fred&Linda
  <entryNum>
    123
  </entryNum>
</entrants>

10.4. 바인딩의 rootNode 특성 설정 덮어쓰기

각 개별 메시지에 대해 rootNode 특성을 설정하거나 메시지 바인딩 내부의 xformat:body 요소를 사용하여 특정 메시지에 대한 전역 설정을 덮어쓸 수도 있습니다. 예를 들어 예 10.4. “rootNode 세트가 있는 XML 바인딩” 에 정의된 출력 메시지가 입력 메시지와 다른 루트 요소를 갖도록 하려면 예 10.6. “xformat:body사용” 에 표시된 대로 바인딩의 루트 요소를 재정의할 수 있습니다.

예 10.6. xformat:body사용

<binding name="matildaXMLBinding" type="tns:dancingMatildas">
  <xmlformat:binding rootNode="entrants"/>
  <operation name="register">
    <input name="contestant"/>
    <output name="entered">
      <xformat:body rootNode="entryStatus" />
    </output>
  </operation>
</binding>