25.2. 서비스 오브젝트 생성

25.2.1. 개요

javax.xml.ws.Service 클래스는 서비스를 노출하는 모든 엔드포인트의 정의를 포함하는 wsdl:service 요소를 나타냅니다. 따라서 서비스에서 원격 호출을 수행하기 위한 프록시인 wsdl:port 요소에 의해 정의된 엔드포인트를 가져올 수 있는 메서드를 제공합니다.

참고

Service 클래스는 XML 문서 작업과 달리 클라이언트 코드가 Java 유형에서 작업할 수 있도록 하는 추상화를 제공합니다.

25.2.2. create() 메서드

Service 클래스에는 새 Service 오브젝트를 생성하는 데 사용할 수 있는 두 가지 static create() 메서드가 있습니다. 예 25.1. “Service create() 메서드” 에 표시된 대로, 두 create() 메서드 모두 Service 오브젝트가 나타내는 wsdl:service 요소의 QName을 사용하고, 하나는 WSDL 계약의 위치를 지정하는 URI를 취합니다.

참고

모든 서비스는 WSDL 계약을 게시합니다. SOAP/HTTP 서비스의 경우 URI는 일반적으로 ?wsdl 과 함께 추가된 서비스의 URI입니다.

예 25.1. Service create() 메서드

public staticServicecreateURLwsdlLocationQNameserviceNameWebServiceExceptioncreateQNameserviceNameWebServiceException

serviceName 매개변수 값은 QName입니다. 네임스페이스 부분의 값은 서비스의 대상 네임스페이스입니다. 서비스의 대상 네임스페이스는 @WebService 주석의 targetNamespace 속성에 지정됩니다. QName의 로컬 부분의 값은 wsdl:service 요소의 name 속성 값입니다. 다음 방법 중 하나로 이 값을 확인할 수 있습니다. . @WebService 주석의 serviceName 속성에 지정됩니다.

  1. @Web Service 주석의 name 속성 값에 Service를 추가합니다.
  2. SEI 이름에 Service 를 추가합니다.
중요

OSGi 환경에 배포된 프로그래밍 방식으로 생성된 CXF 소비자는 Incurring ClassNotFoundExceptions의 가능성을 피하기 위해 특별한 처리가 필요합니다. 프로그래밍 방식으로 생성된 CXF 소비자가 포함된 각 번들에 대해 Singleton CXF 기본 버스를 생성하고 모든 번들의 CXF 소비자가 이를 사용하는지 확인해야 합니다. 이 보호 장치가 없으면 하나의 번들에서 생성된 CXF 기본 버스가 할당될 수 있으므로 상속 번들이 실패할 수 있습니다.

예를 들어, 번들 A가 CXF 기본 버스를 명시적으로 설정하지 않고 번들 B에 생성된 CXF 기본 버스가 할당되었다고 가정합니다. 번들 A에서 CXF 버스가 추가 기능(예: SSL 또는 WS-Security)으로 구성되어야 하는 경우 또는 번들 A의 애플리케이션에서 특정 클래스 또는 리소스를 로드하는데 필요한 경우 실패합니다. 이는 CXF 버스 인스턴스가 스레드 컨텍스트 클래스 로더(TCCL)를 생성한 번들의 번들 클래스 로더로 설정했기 때문입니다(이 경우 번들 B). 또한 ws4j(CXF에서 WS-Security 구현)와 같은 특정 프레임워크는 TCCL을 사용하여 번들 내부에서 calback 처리기 클래스 또는 기타 속성 파일과 같은 리소스를 로드합니다. 번들 A에는 번들 B의 기본 CXF 버스와 TCCL이 할당되기 때문에 ws4j 계층에서는 ClassNotFoundException 오류가 발생하는 번들 A에서 필요한 리소스를 로드할 수 없습니다.

Singleton CXF 기본 버스를 생성하려면 “예제” 에서와 같이 서비스 오브젝트를 생성하는 기본 메서드 시작 부분에 이 코드를 삽입합니다.

BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());

25.2.3. 예제

예 25.2. “서비스 오브젝트 생성” 예 24.7. “완전히 주석 처리 SEI” 에 표시된 SEI의 Service 오브젝트를 생성하는 코드를 보여줍니다.

예 25.2. 서비스 오브젝트 생성

package com.fusesource.demo;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class Client
{
public static void main(String args[])
  {
    BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());
    QName serviceName = new QName("http://demo.redhat.com", "stockQuoteReporter");
    Service s = Service.create(serviceName);
   ...
  }
}

예 25.2. “서비스 오브젝트 생성” 의 코드는 다음을 수행합니다.

서비스의 모든 CXF 소비자가 사용할 수 있는 Singleton CXF 기본 버스를 생성합니다.

targetNamespace 속성과 @WebService 주석의 name 속성을 사용하여 서비스의 QName을 빌드합니다.

단일 매개변수 create() 메서드를 호출하여 새 Service 오브젝트를 생성합니다.

참고

단일 매개변수 create() 를 사용하면 WSDL 계약에 액세스하는 데 종속성을 확보할 수 없습니다.