29.4. 계약 확인 방법 사용

29.4.1. 개요

런타임에 WSDL 문서 위치를 해결하기 위한 가장 관련된 메커니즘은 사용자 정의 계약 확인자를 구현하는 것입니다. 이를 위해서는 Apache CXF 특정 ServiceContractResolver 인터페이스를 구현해야 합니다. 또한 버스에 사용자 정의 리졸버를 등록해야 합니다.

적절하게 등록하면 사용자 정의 계약 확인자는 필요한 WSDL 및 스키마 문서의 위치를 해결하는 데 사용됩니다.

29.4.2. 계약 확인 방법 구현

계약 확인자는 org.apache.cxf.endpoint.ServiceContractResolver 인터페이스의 구현입니다. 예 29.3. “ServiceContractResolver Interface” 에 표시된 대로 이 인터페이스에는 구현해야 하는 단일 메서드 getContractLocation() 이 있습니다. getContractLocation() 은 서비스의 QName을 가져와 서비스의 WSDL 계약 URI를 반환합니다.

예 29.3. ServiceContractResolver Interface

public interface ServiceContractResolver
{
   URI getContractLocation(QName qname);
}

WSDL 계약의 위치를 해결하는 데 사용되는 논리는 애플리케이션별입니다. UDDI 레지스트리, 데이터베이스, 파일 시스템의 사용자 지정 위치 또는 선택한 기타 메커니즘에서 계약 위치를 확인하는 논리를 추가할 수 있습니다.

29.4.3. 계약 확인 프로그램을 프로그래밍 방식으로 등록

Apache CXF 런타임에서 계약 확인자를 사용하기 전에 계약 확인자 레지스트리에 등록해야 합니다. 계약 확인자 레지스트리는 org.apache.cxf.endpoint.ServiceContractResolverRegistry 인터페이스를 구현합니다. 그러나 자체 레지스트리를 구현할 필요는 없습니다. Apache CXF는 org.apache.cxf.endpoint.ServiceContractResolverRegistryImpl 클래스에서 기본 구현을 제공합니다.

기본 레지스트리에 계약 확인자를 등록하려면 다음을 수행합니다.

  1. 기본 버스 오브젝트에 대한 참조를 가져옵니다.
  2. 버스의 getExtension() 메서드를 사용하여 버스에서 서비스 계약 레지스트리를 가져옵니다.
  3. 계약 확인자의 인스턴스를 만듭니다.
  4. 레지스트리의 register() 메서드를 사용하여 레지스트리에 계약 확인자를 등록합니다.

예 29.4. “계약 해결 관리자 등록” 은 계약 확인자를 기본 레지스트리로 등록하는 코드를 보여줍니다.

예 29.4. 계약 해결 관리자 등록

BusFactory bf=BusFactory.newInstance();
Bus bus=bf.createBus();

ServiceContractResolverRegistry registry = bus.getExtension(ServiceContractResolverRegistry);

JarServiceContractResolver resolver = new JarServiceContractResolver();

registry.register(resolver);

예 29.4. “계약 해결 관리자 등록” 의 코드는 다음을 수행합니다.

버스 인스턴스를 가져옵니다.

버스 계약 확인자 레지스트리를 가져옵니다.

계약 확인자의 인스턴스를 생성합니다.

레지스트리에 계약 확인자를 등록합니다.

29.4.4. 구성을 사용하여 계약 확인자 등록

구성을 통해 클라이언트에 추가할 수 있도록 계약 확인자를 구현할 수도 있습니다. 계약 확인자는 런타임에서 구성을 읽고 확인자 자체를 인스턴스화하는 방식으로 구현됩니다. 런타임에서 초기화를 처리하므로 클라이언트가 계약 확인자를 사용해야 하는 경우 런타임에 결정할 수 있습니다.Because the runtime handles the initialization, you can decide at runtime if a client needs to use the contract resolver.

구성을 통해 클라이언트에 추가할 수 있도록 계약 확인자를 구현하려면 다음을 수행합니다.

  1. 계약 확인자 구현에 init() 메서드를 추가합니다.
  2. 예 29.4. “계약 해결 관리자 등록” 과 같이 계약 확인자 레지스트리를 사용하여 계약 확인자를 등록하는 init() 메서드에 논리를 추가합니다.
  3. @PostConstruct 주석을 사용하여 init() 메서드를 장식합니다.

예 29.5. “구성을 사용하여 등록할 수 있는 서비스 계약 해결” 구성을 사용하여 클라이언트에 추가할 수 있는 계약 확인자 구현을 보여줍니다.

예 29.5. 구성을 사용하여 등록할 수 있는 서비스 계약 해결

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.xml.namespace.QName;

import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;

public class UddiResolver implements ServiceContractResolver
{
  private Bus bus;
  ...

  @PostConstruct
  public void init()
  {
    BusFactory bf=BusFactory.newInstance();
    Bus bus=bf.createBus();
    if (null != bus)
    {
      ServiceContractResolverRegistry resolverRegistry = bus.getExtension(ServiceContractResolverRegistry.class);
      if (resolverRegistry != null)
      {
        resolverRegistry.register(this);
      }
    }
  }

  public URI getContractLocation(QName serviceName)
  {
    ...
  }
}

클라이언트에 계약 확인자를 등록하려면 빈 요소를 클라이언트의 구성에 추가해야 합니다. 요소의 클래스 특성은 계약 확인자를 구현하는 클래스의 이름입니다.

예 29.6. “계약 Resolver 구성” org.apache.cxf.demos.myContractResolver 클래스에서 구현된 구성 확인자를 추가하기 위한 빈을 보여줍니다.

예 29.6. 계약 Resolver 구성

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  ...
  <bean id="myResolver" class="org.apache.cxf.demos.myContractResolver" />
  ...
</beans>

29.4.5. 계약 해결 순서

새 프록시가 생성되면 런타임에서 계약 레지스트리 확인자를 사용하여 원격 서비스의 WSDL 계약을 찾습니다. 계약 확인자 레지스트리는 확인자가 등록된 순서대로 각 계약 확인자의 getContractLocation() 메서드를 호출합니다. 등록된 계약 확인자 중 하나에서 반환된 첫 번째 URI를 반환합니다.

잘 알려진 공유 파일 시스템에서 WSDL 계약을 해결하려고 시도한 계약 확인자를 등록했다면 사용된 유일한 계약 확인자입니다. 그러나 UDDI 레지스트리를 사용하여DL 위치를 해결한 계약 확인자를 등록한 경우, 레지스트리는 두 확인자를 사용하여 서비스의 WSDL 계약을 찾을 수 있습니다. 레지스트리는 먼저 공유 파일 시스템 계약 확인자를 사용하여 계약을 찾습니다. 해당 계약 확인자가 실패한 경우 레지스트리는 UDDI 계약 확인자를 사용하여 찾습니다.