41.2.3. 공급자 오브젝트 구현
41.2.3.1. 개요
공급자 인터페이스는 비교적 쉽게 구현할 수 있습니다. 구현되어야 하는 하나의 메서드인 invoke()
만 있습니다. 여기에는 세 가지 간단한 요구 사항이 있습니다.
-
구현에는
@WebServiceProvider
주석이 있어야 합니다. - 구현에는 기본 public 생성자가 있어야 합니다.
구현에서는 입력한 공급자 버전의 공급자 인터페이스를 구현해야 합니다.
즉, 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
속성 값을 기반으로 합니다.- 모든 메시지의 루트 요소는 네임스페이스 자격입니다.
서비스에서 rpc/literal 메시지를 사용하는 경우 메시지의 최상위 요소는 네임스페이스를 사용할 수 없습니다.
중요최상위 수준의 요소 하위는 네임스페이스를 정규화할 수 있지만 스키마 정의를 확인해야 합니다.
- 서비스에서 rpc/literal 메시지를 사용하는 경우 최상위 요소 중 어느 것도 null일 수 없습니다.
- 서비스에서 doc/literal 메시지를 사용하는 경우 메시지의 스키마 정의는 요소 중 하나의 네임스페이스가 있는지 여부를 결정합니다.
41.2.3.3. @WebServiceProvider 주석
JAX-WS에서 서비스 구현으로 인식하려면 공급자 구현을 @WebServiceProvider
주석으로 장식해야 합니다.
표 41.2. “@WebServiceProvider
Properties” @WebServiceProvider
주석에 대해 설정할 수 있는 속성을 설명합니다.
속성 | 설명 |
---|---|
|
서비스의 엔드포인트를 정의하는 |
|
서비스의 엔드포인트를 포함하는 |
| 서비스 WSDL 정의의 targetname 공간을 지정합니다. |
| 서비스를 정의하는 WSDL 문서의 URI를 지정합니다. |
이러한 속성은 모두 선택 사항이며 기본적으로 비어 있습니다. 이를 비워 두면 Apache CXF는 구현 클래스의 정보를 사용하여 값을 생성합니다.
41.2.3.4. invoke() 메서드 구현
Provider 인터페이스에는 구현해야 하는 하나의 메서드인 invoke()
만 있습니다. invoke()
메서드는 구현되는 공급자 인터페이스 유형에서 선언된 오브젝트 유형으로 패키징된 들어오는 요청을 수신하고 동일한 유형의 개체에 패키지된 응답 메시지를 반환합니다. 예를 들어, Provider<SOAPMessage> 인터페이스의 구현은 요청을 SOAPMessage
오브젝트로 수신하고 response를 SOAPMessage
개체로 반환합니다.
공급자 구현에서 사용하는 메시징 모드는 요청 및 응답 메시지에 포함된 바인딩 특정 정보의 양을 결정합니다. 메시지 모드를 사용하는 구현에서는 요청과 함께 모든 바인딩 특정 래퍼 및 헤더를 수신합니다. 또한 모든 바인딩 특정 래퍼 및 헤더를 응답 메시지에 추가해야 합니다. 페이로드 모드를 사용하는 구현에서는 요청 본문만 받습니다. 페이로드 모드를 사용한 구현에서 반환된 XML 문서는 요청 메시지의 본문에 배치됩니다.
41.2.3.5. 예제
예 41.11. “provider<SOAPMessage> 구현” 메시지 모드에서 SOAPMessage
개체와 함께 작동하는 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
요소의 이름이 stockQuoteReporter
이고 wsdl:port
요소의 이름이 stockQuoteReporterPort
인 서비스를 구현하는 Provider 개체를 지정합니다.
이 공급자 구현에서 메시지 모드를 사용하도록 지정합니다.
필수 기본 public 생성자를 제공합니다.
SOAPMessage 개체를 사용하고 SOAPMessage 개체를 반환하는 invoke()
메서드의 구현을 제공합니다.Provides an implementation of the invoke() method that takes a
object and returns a SOAPMessage object.
SOAPMessage
들어오는 SOAP 메시지의 본문에서 요청 메시지를 추출합니다.
요청 메시지의 루트 요소를 검사하여 요청을 처리하는 방법을 결정합니다.
응답을 빌드하는 데 필요한 공장을 생성합니다.
응답에 대한 SOAP 메시지를 작성합니다.
response를 SOAPMessage
오브젝트로 반환합니다.
예 41.12. “provider<DOMSource> 구현” 페이로드 모드에서 DOMSource
개체를 사용하는 공급자 구현의 예를 보여줍니다.
예 41.12. provider<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. “provider<DOMSource> 구현” 의 코드는 다음을 수행합니다.
클래스에서 wsdl:service
요소의 이름이 stockQuoteReporter
이고 wsdl:port
요소의 이름이 stockQuoteReporterPort
인 서비스를 구현하는 Provider 개체를 지정합니다.
이 공급자 구현에서 페이로드 모드를 사용하도록 지정합니다.
필수 기본 public 생성자를 제공합니다.
DOMSource 개체를 가져와서 DOMSource 개체를 반환하는 invoke()
메서드의 구현을 제공합니다.Provides an implementation of the invoke() method that takes a
object and returns a DOMSource object.
DOMSource