41.2. 서비스 공급자에서 XML 사용
초록
공급자 인터페이스는 원시 XML로 메시지에서 직접 작동하는 서비스 공급자를 구현할 수 있는 낮은 수준의 Cryostat-WS API입니다. 메시지는 Provider 인터페이스를 구현하는 개체에 전달되기 전에는 패키지되지 않습니다.
41.2.1. 메시징 모드
41.2.1.1. 개요
공급자 인터페이스를 구현하는 오브젝트에는 두 가지 메시징 모드가 있습니다.
지정한 메시징 모드에 따라 구현에 전달되는 메시징 세부 정보가 결정됩니다.
41.2.1.2. 메시지 모드
메시지 모드를 사용하는 경우 공급자 구현이 완전한 메시지와 함께 작동합니다. 전체 메시지에는 바인딩 특정 헤더 및 래퍼가 포함됩니다. 예를 들어 Cryostat 바인딩을 사용하는 공급자 구현은 요청을 완전히 지정된 Cryostat 메시지로 수신합니다. 구현에서 반환된 모든 응답은 완전히 지정된 Cryostat 메시지여야 합니다.
공급자 구현에서 예 41.9. “공급자 구현에서 메시지 모드를 사용하도록 지정” 와 같이 java.xml.ws.Service.Mode.MESSAGE 값을 javax.xml.ws.ServiceMode
주석의 값으로 제공하여 메시지 모드를 사용하도록 지정하려면 다음을 수행합니다.
예 41.9. 공급자 구현에서 메시지 모드를 사용하도록 지정
@WebServiceProvider @ServiceMode(value=Service.Mode.MESSAGE) public class stockQuoteProvider implements Provider<SOAPMessage> { ... }
41.2.1.3. 페이로드 모드
페이로드 모드에서 는 공급자 구현이 메시지의 페이로드에서만 작동합니다. 예를 들어 페이로드 모드에서 작동하는 공급자 구현은 ESP 메시지의 본문에서만 작동합니다. 바인딩 계층은 바인딩 수준 래퍼 및 헤더를 처리합니다.
Apache CXF XML 바인딩, 페이로드 모드 및 메시지 모드와 같이 특수 래퍼를 사용하지 않는 바인딩으로 작업하는 경우 동일한 결과를 제공합니다.
공급자 구현에서 예 41.10. “공급자 구현에서 페이로드 모드를 사용하도록 지정” 와 같이 java.xml.ws.Service.Mode.PAYLOAD 값을 javax.xml.ws.ServiceMode
주석의 값으로 제공하여 페이로드 모드를 사용하도록 지정하려면 다음을 수행합니다.
예 41.10. 공급자 구현에서 페이로드 모드를 사용하도록 지정
@WebServiceProvider @ServiceMode(value=Service.Mode.PAYLOAD) public class stockQuoteProvider implements Provider<DOMSource> { ... }
@ServiceMode
주석의 값을 지정하지 않으면 공급자 구현에서 페이로드 모드를 사용합니다.
41.2.2. 데이터 유형
41.2.2.1. 개요
공급자 구현은 하위 수준 개체이므로 공급자 구현에서 더 높은 수준의 소비자 API와 동일한 CryostatB 생성 유형을 사용할 수 없습니다. 공급자 구현은 다음 유형의 오브젝트에서 작동합니다.
41.2.2.2. 소스 오브젝트 사용
공급자 구현은 javax.xml.transform.Source 인터페이스에서 파생된 오브젝트를 수락하고 반환할 수 있습니다. 소스 오브젝트는 XML 문서를 보유하는 하위 수준 오브젝트입니다. 각 소스 구현은 저장된 XML 문서에 액세스하고 해당 내용을 조작하는 메서드를 제공합니다. 다음 오브젝트는 소스 인터페이스를 구현합니다.
CryostatSource
-
XML 메시지를 Document Object Model(DOM) 트리로 보관합니다. XML 메시지는
get
메서드를 사용하여 액세스하는 노드 오브젝트 세트로 저장됩니다. 노드는Node
()setNode()
메서드를 사용하여 Cryostat 트리에 업데이트하거나 추가할 수 있습니다. SAXSource
-
XML 메시지를 SX(Simple API for XML) 개체로 보관합니다. SAX 개체에는 원시 데이터 및 원시 데이터를 구문 분석하는
XML
Cryostat 개체를 보유하는InputSource
오브젝트가 포함되어 있습니다. StreamSource
- XML 메시지를 데이터 스트림으로 보관합니다. 데이터 스트림은 다른 데이터 스트림과 동일하게 조작될 수 있습니다.
일반 소스 오브젝트를 사용하도록 Provider 오브젝트를 생성하면 Apache CXF에서 메시지를 SAXSource
개체로 반환합니다.
이 동작은 끝점의 source-preferred-format
속성을 사용하여 변경할 수 있습니다. Apache CXF 런타임 구성에 대한 자세한 내용은 IV 부. 웹 서비스 엔드 포인트 구성 을 참조하십시오.
Source 오브젝트를 사용할 때 개발자는 필요한 모든 바인딩 특정 래퍼가 메시지에 추가되도록 합니다. 예를 들어, Cryostat 메시지를 예상하는 서비스와 상호 작용할 때 개발자는 필요한 Cryostat가 발신 요청에 추가되고 Cryostat의 콘텐츠가 올바른지 확인해야 합니다.
41.2.2.3. CryostatMessage 오브젝트 사용
다음 조건이 true인 경우 공급자 구현에서는 javax.xml.soap.SOAPMessage
오브젝트를 사용할 수 있습니다.
- Provider 구현에서 source binding을 사용하고 있습니다.
- 공급자 구현에서 메시지 모드를 사용 중
Cryo statMessage
오브젝트에는 Cryostat 메시지가 있습니다. 이 개체에는 하나의 CryostatPart
개체와 0개 이상의 AttachmentPart
개체가 포함되어 있습니다. Cryo statPart
개체에는 Cryostat, any Cryostat 헤더 및 Cryostat 메시지 본문을 포함하여 Cryostat 메시지의 Cryostat 특정 부분이 포함되어 있습니다. AttachmentPart
오브젝트에는 첨부 파일로 전달되는 바이너리 데이터가 포함되어 있습니다.
41.2.2.4. DataSource 개체 사용
다음 조건이 true인 경우 공급자 구현에서는 javax.activation.DataSource 인터페이스를 구현하는 오브젝트를 사용할 수 있습니다.
- 구현에서 HTTP 바인딩을 사용하고 있습니다.
- 구현에서 메시지 모드를 사용 중입니다.
데이터 소스 오브젝트는 URL, 파일, 바이트 배열을 포함하여 다양한 소스에서 MIME 형식 데이터를 사용하기 위한 메커니즘을 제공합니다.
41.2.3. 공급자 오브젝트 구현
41.2.3.1. 개요
공급자 인터페이스는 구현하기가 비교적 쉽습니다. 구현되어야 하는 하나의 메서드인 invoke()
만 있습니다. 또한 세 가지 간단한 요구 사항이 있습니다.
-
구현에
@WebServiceProvider
주석이 있어야 합니다. - 구현에는 기본 공용 생성자가 있어야 합니다.
구현에서는 입력된 버전의 공급자 인터페이스를 구현해야 합니다.
즉, Provider<T> 인터페이스를 구현할 수 없습니다. 41.2.2절. “데이터 유형” 에 나열된 대로 구체적인 데이터 유형을 사용하는 인터페이스 버전을 구현해야 합니다. 예를 들어 Provider<SAXSource>의 인스턴스를 구현할 수 있습니다.
공급자 인터페이스 구현의 복잡성은 요청 메시지를 처리하고 적절한 응답을 구축하는 논리에 있습니다.
41.2.3.2. 메시지 작업
상위 수준 SEI 기반 서비스 구현과 달리 공급자 구현은 요청을 원시 XML 데이터로 수신하며 응답을 원시 XML 데이터로 보내야 합니다. 이를 위해서는 개발자가 구현 중인 서비스에서 사용하는 메시지에 대한 지식이 있어야 합니다. 이러한 세부 사항은 일반적으로 서비스를 설명하는 WSDL 문서에서 확인할 수 있습니다.
WS-I Basic Profile 은 다음을 포함하여 서비스에서 사용하는 메시지에 대한 지침을 제공합니다.
요청의 루트 요소는 호출되는 작업에 해당하는
wsdl:operation
요소의name
속성 값을 기반으로 합니다.주의서비스에서 doc/literal 베어 메시지를 사용하는 경우 요청의 루트 요소는
wsdl:operation
요소에서 참조하는wsdl:part
요소의name
속성 값을 기반으로 합니다.- 모든 메시지의 root 요소는 namespace qualified입니다.
서비스에서 rpc/literal 메시지를 사용하는 경우 메시지의 최상위 요소는 네임스페이스가 정규화되지 않습니다.
중요최상위 요소의 자식은 네임스페이스를 정규화할 수 있지만 스키마 정의를 확인해야 합니다.
- 서비스에서 rpc/literal 메시지를 사용하는 경우 최상위 요소 중 어느 것도 null일 수 없습니다.
- 서비스에서 doc/literal 메시지를 사용하는 경우 메시지의 스키마 정의에서 네임스페이스가 유효한지 여부를 결정합니다.
41.2.3.3. @WebServiceProvider 주석
Cryostat-WS에서 서비스 구현으로 인식하려면 공급자 구현을 @WebServiceProvider
주석으로 데코레이팅해야 합니다.
표 41.2. “@WebServiceProvider
Properties” @WebServiceProvider
주석에 대해 설정할 수 있는 속성에 대해 설명합니다.
속성 | 설명 |
---|---|
|
서비스의 엔드포인트를 정의하는 |
|
서비스의 엔드포인트가 포함된 |
| 서비스의 WSDL 정의의 targetname 공간을 지정합니다. |
| 서비스를 정의하는 WSDL 문서의 URI를 지정합니다. |
이러한 속성은 모두 선택 사항이며 기본적으로 비어 있습니다. 해당 항목을 비워 두면 Apache CXF는 구현 클래스에서 정보를 사용하여 값을 생성합니다.
41.2.3.4. invoke() 메서드 구현
공급자 인터페이스에는 구현해야 하는 하나의 메서드인 invoke()
만 있습니다. invoke()
메서드는 구현 중인 공급자 인터페이스 유형에서 선언한 오브젝트 유형으로 패키지된 들어오는 요청을 수신하고 동일한 유형의 오브젝트로 패키지된 응답 메시지를 반환합니다. 예를 들어 Provider< SOAPMessage
> 인터페이스의 구현은 request를 CryostatMessage 오브젝트로 수신하고 response를 Cryostat Message
오브젝트로 반환합니다.
공급자 구현에서 사용하는 메시징 모드에 따라 요청 및 응답 메시지에 포함된 바인딩 특정 정보의 양이 결정됩니다. 메시지 모드를 사용하는 구현은 요청과 함께 특정 래퍼 및 헤더를 모두 수신합니다. 또한 응답 메시지에 특정 래퍼 및 헤더를 모두 추가해야 합니다. 페이로드 모드를 사용하는 구현은 요청 본문만 수신합니다. 페이로드 모드를 사용하여 구현에 의해 반환된 XML 문서는 요청 메시지의 본문에 배치됩니다.
41.2.3.5. 예
예 41.11. “provider<SOAPMessage> 구현” 메시지 모드에서 Cryostat Message 개체와 함께
작동하는 Provider 구현을 표시합니다.
예 41.11. provider<SOAPMessage> 구현
import javax.xml.ws.Provider; import javax.xml.ws.Service; import javax.xml.ws.ServiceMode; import javax.xml.ws.WebServiceProvider; @WebServiceProvider(portName="stockQuoteReporterPort" serviceName="stockQuoteReporter") @ServiceMode(value="Service.Mode.MESSAGE") public class stockQuoteReporterProvider implements Provider<SOAPMessage> { public stockQuoteReporterProvider() { } public SOAPMessage invoke(SOAPMessage request) { SOAPBody requestBody = request.getSOAPBody(); if(requestBody.getElementName.getLocalName.equals("getStockPrice")) { MessageFactory mf = MessageFactory.newInstance(); SOAPFactory sf = SOAPFactory.newInstance(); SOAPMessage response = mf.createMessage(); SOAPBody respBody = response.getSOAPBody(); Name bodyName = sf.createName("getStockPriceResponse"); respBody.addBodyElement(bodyName); SOAPElement respContent = respBody.addChildElement("price"); respContent.setValue("123.00"); response.saveChanges(); return response; } ... } }
예 41.11. “provider<SOAPMessage> 구현” 의 코드는 다음을 수행합니다.
다음 클래스는 wsdl:service
요소라는 서비스를 구현하는 Provider 오브젝트를 구현하도록 합니다. 이 개체의 이름은 score QuoteReporter
이고, 해당 wsdl:port
요소 이름이 price QuoteReporterPort
입니다.
이 공급자 구현에서 메시지 모드를 사용하도록 지정합니다.
필요한 기본 공용 생성자를 제공합니다.
ESPMessage 개체를 사용하고 Cryostat Message 개체를
반환하는 invoke()
메서드의 구현을 제공합니다.
들어오는 Cryostat 메시지의 본문에서 요청 메시지를 추출합니다.
요청 메시지의 root 요소를 확인하여 요청을 처리하는 방법을 결정합니다.
응답을 구축하는 데 필요한 공장을 만듭니다.
응답에 대한 Cryostat 메시지를 빌드합니다.
response를 Cryostat Message
오브젝트로 반환합니다.
예 41.12. “공급자<DOMSource> 구현” 페이로드 모드에서 192.0.2. Source 개체를 사용하는
공급자 구현 예를 보여줍니다.
예 41.12. 공급자<DOMSource> 구현
import javax.xml.ws.Provider; import javax.xml.ws.Service; import javax.xml.ws.ServiceMode; import javax.xml.ws.WebServiceProvider; @WebServiceProvider(portName="stockQuoteReporterPort" serviceName="stockQuoteReporter") @ServiceMode(value="Service.Mode.PAYLOAD") public class stockQuoteReporterProvider implements Provider<DOMSource> public stockQuoteReporterProvider() { } public DOMSource invoke(DOMSource request) { DOMSource response = new DOMSource(); ... return response; } }
예 41.12. “공급자<DOMSource> 구현” 의 코드는 다음을 수행합니다.
클래스가 wsdl:service
요소의 이름이 scoreQuoteReporter 이고 해당 wsdl:port
요소 이름이 equivalent
인 서비스를 구현하는 Provider 오브젝트를 지정합니다.
QuoteReporter
Port
이 공급자 구현에서 페이로드 모드를 사용하도록 지정합니다.
필요한 기본 공용 생성자를 제공합니다.
CryostatSource 개체를 사용하고 192.0.2. Source 개체를
반환하는 invoke()
메서드의 구현을 제공합니다.