41.2. 서비스 공급자의 XML 사용


초록

공급자 인터페이스는 메시지에서 직접 원시 XML로 직접 작동하는 서비스 공급자를 구현할 수 있는 하위 수준 JAX-WS API입니다. 메시지는 Provider 인터페이스를 구현하는 개체에 전달하기 전에 JAXB 개체에 패키징되지 않습니다.

41.2.1. 메시징 모드

41.2.1.1. 개요

공급자 인터페이스를 구현하는 오브젝트에는 두 가지 메시징 모드 가 있습니다.

지정하는 메시징 모드는 구현에 전달되는 메시징 세부 수준을 결정합니다.

41.2.1.2. 메시지 모드

메시지 모드 를 사용할 때 공급자 구현은 완전한 메시지와 함께 작동합니다. 전체 메시지에는 바인딩 특정 헤더 및 래퍼가 포함됩니다. 예를 들어 SOAP 바인딩을 사용하는 공급자 구현은 완전히 지정된 SOAP 메시지로서 요청을 수신합니다. 구현에서 반환된 응답은 완전히 지정된 SOAP 메시지여야 합니다.

공급자 구현에서 예 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. 페이로드 모드

페이로드 모드에서 공급자 구현은 메시지의 페이로드만 사용하여 작동합니다. 예를 들어 페이로드 모드에서 작동하는 공급자 구현은 SOAP 메시지의 본문에서만 작동합니다. 바인딩 계층은 바인딩 수준 래퍼 및 헤더를 처리합니다.

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와 동일한 JAXB 생성 유형을 사용할 수 없습니다. 공급자 구현은 다음 유형의 오브젝트에서 작동합니다.

41.2.2.2. 소스 오브젝트 사용

공급자 구현은 javax.xml.transform.Source 인터페이스에서 파생된 개체를 수락 및 반환할 수 있습니다. 소스 개체는 XML 문서를 보유하는 낮은 수준의 개체입니다.Source objects are low level objects that hold XML documents. 각 소스 구현은 저장된 XML 문서에 액세스하고 해당 콘텐츠를 조작하는 메서드를 제공합니다. 다음 오브젝트는 소스 인터페이스를 구현합니다.

DOMSource
XML 메시지를 Document Object Model(DOM) 트리로 보관합니다. XML 메시지는 getNode() 메서드를 사용하여 액세스하는 Node 오브젝트 세트로 저장됩니다. 노드는 setNode() 메서드를 사용하여 DOM 트리에 업데이트되거나 추가될 수 있습니다.
saXSource
XML 메시지를SAX(Simple API for XML) 개체로 보유하고 있습니다. SAX 오브젝트에는 원시 데이터와 원시 데이터를 구문 분석하는 XMLReader 개체를 보유하는 InputSource 개체가 포함되어 있습니다.
StreamSource
XML 메시지를 데이터 스트림으로 보관합니다. 데이터 스트림은 다른 데이터 스트림과 동일하게 조작될 수 있습니다.

일반 소스 개체를 사용하도록 Provider 개체를 생성하는 경우 Apache CXF는 메시지를 SAXSource 개체로 반환합니다.

이 동작은 끝점의 source-preferred-format 속성을 사용하여 변경할 수 있습니다. Apache CXF 런타임 구성에 대한 자세한 내용은 IV 부. 웹 서비스 엔드 포인트 구성 을 참조하십시오.

중요

Source 개체를 사용할 때 개발자는 필요한 모든 바인딩 특정 래퍼가 메시지에 추가되도록 담당합니다. 예를 들어 SOAP 메시지가 필요한 서비스와 상호 작용할 때 개발자는 필요한 SOAP 봉투가 발신 요청에 추가되고 SOAP 봉투의 콘텐츠가 올바른지 확인해야 합니다.

41.2.2.3. SOAPMessage 오브젝트 사용

공급자 구현에서는 다음 조건이 true인 경우 javax.xml.soap.SOAPMessage 오브젝트를 사용할 수 있습니다.

  • 공급자 구현에서는 SOAP 바인딩을 사용하고 있습니다.
  • 공급자 구현에서는 메시지 모드를 사용합니다.

SOAPMessage 오브젝트에는 SOAP 메시지가 있습니다. 하나의 SOAPPart 오브젝트와 1개 이상의 AttachmentPart 오브젝트가 포함됩니다. SOAPPart 오브젝트에는 SOAP 봉투, 모든 SOAP 헤더 및 SOAP 메시지 본문을 포함한 SOAP 메시지의 SOAP 특정 부분이 포함되어 있습니다. AttachmentPart 오브젝트에는 첨부 파일로 전달되는 바이너리 데이터가 포함되어 있습니다.

41.2.2.4. DataSource 개체 사용

공급자 구현에서는 다음 조건이 true인 경우 javax.activation.DataSource 인터페이스를 구현하는 개체를 사용할 수 있습니다.

  • 구현에서는 HTTP 바인딩 사용
  • 구현은 메시지 모드를 사용합니다.

데이터 소스 오브젝트는 URL, 파일, 바이트 배열을 포함하여 다양한 소스의 MIME 형식 데이터를 사용하기 위한 메커니즘을 제공합니다.

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 주석에 대해 설정할 수 있는 속성을 설명합니다.

표 41.2. @WebServiceProvider Properties
속성설명

portName

서비스의 엔드포인트를 정의하는 wsdl:port 요소의 name 속성 값을 지정합니다.

serviceName

서비스의 엔드포인트를 포함하는 wsdl:service 요소의 name 속성 값을 지정합니다.

targetNamespace

서비스 WSDL 정의의 targetname 공간을 지정합니다.

wsdlLocation

서비스를 정의하는 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 SOAPMessage object and returns a SOAPMessage object.

들어오는 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 DOMSource object and returns a DOMSource object.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.