25.2. 서비스 오브젝트 생성
25.2.1. 개요
javax.xml.ws.Service
클래스는 서비스를 노출하는 모든 끝점의 정의가 포함된 wsdl:service
요소를 나타냅니다. 따라서 서비스에서 원격 호출을 수행하기 위한 프록시인 wsdl:port
요소에 의해 정의된 엔드포인트를 가져올 수 있는 메서드를 제공합니다.
Service
클래스는 XML 문서를 사용하는 대신 클라이언트 코드가 Java 형식으로 작업할 수 있도록 하는 추상화를 제공합니다.
25.2.2. create() 메서드
Service
클래스에는 새 Service
개체를 만드는 데 사용할 수 있는 두 개의 정적 create()
메서드가 있습니다. 예 25.1. “Service
create()
Methods” 에 표시된 대로 두 create()
메서드는 Service
오브젝트가 나타내는 wsdl:service
요소의 QName을 사용하고, 하나는 WSDL 계약의 위치를 지정하는 URI를 사용합니다.
모든 서비스는 WSDL 계약을 게시합니다. Cryostat/HTTP 서비스의 경우 URI는 일반적으로 ?wsdl
.wsdl이 추가된 서비스에 대한 URI입니다.
예 25.1. Service
create()
Methods
공용 정적서비스
생성
URL
wsdlLocation
QName
serviceName
WebServiceExceptionpublic staticService
create
QName
serviceName
WebServiceException
serviceName
매개변수의 값은 QName입니다. 네임스페이스 부분 값은 서비스의 대상 네임스페이스입니다. 서비스의 대상 네임스페이스는 @WebService
주석의 targetNamespace
속성에 지정됩니다. QName의 로컬 부분의 값은 wsdl:service
요소의 name
속성 값입니다. 다음 방법 중 하나로 이 값을 확인할 수 있습니다. . @WebService
주석의 serviceName
속성에 지정됩니다.
-
Service
를@WebService
주석의name
속성 값에 추가합니다. -
SEI 이름에
서비스를
추가합니다.
OSGi 환경에 배포된 프로그래밍 방식으로 생성된 CXF 소비자는 ClassNotFoundException
s가 발생할 가능성을 방지하기 위해 특별한 처리가 필요합니다. 프로그래밍 방식으로 생성된 CXF 소비자가 포함된 각 번들에 싱글톤 CXF 기본 버스를 생성하고 모든 번들의 CXF 소비자가 이를 사용하는지 확인해야 합니다. 이 보호 장치가 없으면 하나의 번들에 다른 번들에서 생성된 CXF 기본 버스가 할당되어 상속 번들에 실패할 수 있습니다.
예를 들어 번들 A에서 CXF 기본 버스를 명시적으로 설정하지 않았으며 번들 B에서 생성된 CXF 기본 버스가 할당되었다고 가정합니다. 번들 A의 CXF 버스를 추가 기능(예: SSL 또는 WS-Security)으로 구성하거나 번들 A에서 애플리케이션의 특정 클래스 또는 리소스를 로드해야 하는 경우 실패합니다. 이는 CXF 버스 인스턴스가 스레드 컨텍스트 클래스 로더(TCCL)를 생성한 번들의 번들 클래스 로더(이 경우 번들 B)로 설정하기 때문입니다. 또한 CXF의 WS-Security 구현과 같은 특정 프레임워크는 TCCL을 사용하여 번들 내부에서 calback 처리기 클래스 또는 기타 속성 파일과 같은 리소스를 로드합니다. 번들 A에는 번들 B의 기본 CXF 버스가 할당되어 있고 TCCL이므로 ws4j 계층에서 번들 A에서 필요한 리소스를 로드할 수 없으므로 ClassNotFoundException
오류가 발생합니다.
Singleton CXF 기본 버스를 생성하려면 “예” 와 같이 서비스 오브젝트를 생성하는 기본
방법의 시작 부분에 이 코드를 삽입합니다.
BusFactory.setThreadDefaultBus(BusFactory.newInstance().createBus());
25.2.3. 예
예 25.2. “서비스
오브젝트 생성” 예 24.7. “완전히 주석 처리됨 SEI” 에 표시된 SEI의 서비스
오브젝트를 생성하는 코드를 보여줍니다.
예 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 사용자가 사용할 수 있는 싱글톤 CXF 기본 버스를 생성합니다.
targetNamespace
속성 및 @WebService
주석의 name
속성을 사용하여 서비스의 QName을 빌드합니다.
단일 매개 변수 create()
메서드를 호출하여 새 Service
오브젝트를 생성합니다.
단일 매개변수 create()
를 사용하면 WSDL 계약에 액세스하는 데 대한 종속성을 가질 수 없습니다.