43.10. 핸들러를 사용하도록 끝점 구성

43.10.1. 프로그래밍 방식 설정

43.10.1.1. 소비자에 핸들러 체인 추가

43.10.1.1.1. 개요

소비자에 처리기 체인을 추가하면 핸들러 체인을 명시적으로 빌드해야 합니다. 그런 다음 서비스 프록시의 Binding 오브젝트에 핸들러 체인을 직접 설정합니다.

중요

Spring 구성을 사용하여 구성된 모든 처리기 체인은 프로그래밍 방식으로 구성된 처리기 체인을 재정의합니다.

43.10.1.1.2. 절차

고객에게 처리기 체인을 추가하려면 다음을 수행합니다.

  1. 처리기 체인을 보유 하는 List<Handler > 오브젝트를 생성합니다.
  2. 체인에 추가될 각 핸들러의 인스턴스를 생성합니다.
  3. 런타임에 각 인스턴스화된 처리기 개체를 목록에 추가합니다.Add each of the instantiated handler objects to the list in the order they are to be invoked by the runtime.
  4. 서비스 프록시에서 바인딩 오브젝트를 가져옵니다.

    Apache CXF는 org.apache.cxf.jaxws.binding.DefaultBindingImpl 이라는 바인딩 인터페이스 구현을 제공합니다.

  5. Binding 개체의 setHandlerChain() 메서드를 사용하여 프록시에 처리기 체인을 설정합니다.
43.10.1.1.3. 예제

예 43.14. “소비자에 핸들러 체인 추가” 소비자에 처리기 체인을 추가하기 위한 코드를 보여줍니다.

예 43.14. 소비자에 핸들러 체인 추가

import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.Handler;
import java.util.ArrayList;
import java.util.List;

import org.apache.cxf.jaxws.binding.DefaultBindingImpl;
...
SmallNumberHandler sh = new SmallNumberHandler();
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(sh);

DefaultBindingImpl binding = ((BindingProvider)proxy).getBinding();
binding.getBinding().setHandlerChain(handlerChain);

예 43.14. “소비자에 핸들러 체인 추가” 의 코드는 다음을 수행합니다.

핸들러를 인스턴스화합니다.

List 오브젝트를 생성하여 체인을 유지합니다.

체인에 처리기를 추가합니다.

프록시에서 DefaultBindingImpl 오브젝트로 바인딩 오브젝트를 가져옵니다.

처리기 체인을 프록시의 바인딩에 할당합니다.

43.10.1.2. 서비스 공급자에 핸들러 체인 추가

43.10.1.2.1. 개요

SEI 또는 구현 클래스를 @HandlerChain 주석으로 위임하여 서비스 공급자에 처리기 체인을 추가합니다. 주석은 서비스 공급자가 사용하는 핸들러 체인을 정의하는 메타 데이터 파일을 가리킵니다.

43.10.1.2.2. 절차

서비스 공급자에 처리기 체인을 추가하려면 다음을 수행합니다.

  1. @HandlerChain 주석을 사용하여 공급자의 구현 클래스를 장식합니다.
  2. 처리기 체인을 정의하는 처리기 구성 파일을 생성합니다.
43.10.1.2.3. @HandlerChain 주석

javax.jws.HandlerChain 주석은 서비스 공급자의 구현 클래스를 장식합니다. 런타임에서 파일 속성으로 지정된 처리기 체인 구성 파일 을 로드하도록 지시합니다.

주석의 file 속성은 로드할 처리기 구성 파일을 식별하는 두 가지 방법을 지원합니다.

  • a URL
  • 상대 경로 이름

예 43.15. “Handler Chain을 로드하는 서비스 구현” handlers.xml 이라는 파일에 정의된 핸들러 체인을 사용할 서비스 공급자 구현을 보여줍니다. handlers.xml 은 서비스 공급자가 실행되는 디렉터리에 있어야 합니다.

예 43.15. Handler Chain을 로드하는 서비스 구현

import javax.jws.HandlerChain;
import javax.jws.WebService;
...

@WebService(name = "AddNumbers",
            targetNamespace = "http://apache.org/handlers",
            portName = "AddNumbersPort",
            endpointInterface = "org.apache.handlers.AddNumbers",
            serviceName = "AddNumbersService")
@HandlerChain(file = "handlers.xml")
public class AddNumbersImpl implements AddNumbers
{
...
}
43.10.1.2.4. 처리기 구성 파일

처리기 구성 파일은 JSR 109(Java EE, 버전 1.2용 웹 서비스)의 XML 문법을 사용하여 처리기 체인을 정의합니다. 이 문법은 http://java.sun.com/xml/ns/javaee 에 정의되어 있습니다.

처리기 구성 파일의 루트 요소는 handler-chains 요소입니다. handler-chains 요소에는 하나 이상의 handler-chain 요소가 있습니다.

handler-chain 요소는 처리기 체인을 정의합니다. 표 43.1. “Server-Side Chain을 정의하는 데 사용되는 요소” handler-chain 요소의 하위 요소에 대해 설명합니다.

표 43.1. Server-Side Chain을 정의하는 데 사용되는 요소

요소설명

handler

처리기를 설명하는 요소를 포함합니다.

service-name-pattern

처리기 체인이 바인딩된 서비스를 정의하는 WSDL 서비스 요소의 QName을 지정합니다.Specifies the QName of the WSDL service element defining the service to which the handler chain is bound. QName을 정의할 때 * 를 와일드카드로 사용할 수 있습니다.

port-name-pattern

처리기 체인이 바인딩되는 끝점을 정의하는 WSDL 포트 요소의 QName을 지정합니다. QName을 정의할 때 * 를 와일드카드로 사용할 수 있습니다.

protocol-binding

처리기 체인이 사용되는 메시지 바인딩을 지정합니다. 바인딩은 URI로 지정되거나 다음과 같은 별칭 중 하나로 지정됩니다. #\#SOAP11_HTTP,\# SOAP11_HTTP_MTOM,\#SOAP12_HTTP_ MTOM ,\## SOAP12_HTTP_MTOM 또는 \#\#XML_HTTP.

메시지 바인딩 URI에 대한 자세한 내용은 23장. Apache CXF 바인딩 ID 을 참조하십시오.

handler-chain 요소는 단일 handler 요소를 자식으로 사용하는 경우에만 필요합니다. 그러나 전체 처리기 체인을 정의하는 데 필요한 만큼의 처리기 요소를 지원할 수 있습니다. 체인의 핸들러는 처리기 체인 정의에서 지정된 순서대로 실행됩니다.

중요

실행의 최종 순서는 지정된 핸들러를 논리 처리기 및 프로토콜 처리기로 정렬하여 결정됩니다. 그룹화 내에서 구성에 지정된 순서가 사용됩니다.

protocol-binding 과 같은 다른 하위 항목은 정의된 처리기 체인의 범위를 제한하는 데 사용됩니다. 예를 들어 service-name-pattern 요소를 사용하는 경우 처리기 체인은 지정한 WSDL 서비스 요소의 하위인 서비스 공급자에만 연결됩니다. 처리기 요소에서 이러한 제한 자식 중 하나만 사용할 수 있습니다.

handler 요소는 처리기 체인에서 개별 핸들러를 정의합니다. 해당 handler-class 하위 요소는 처리기를 구현하는 클래스의 정규화된 이름을 지정합니다. handler 요소에는 처리기의 고유한 이름을 지정하는 선택적 handler-name 요소가 있을 수도 있습니다.

예 43.16. “처리기 구성 파일” 단일 처리기 체인을 정의하는 핸들러 구성 파일을 보여줍니다. 체인은 두 개의 핸들러로 구성됩니다.

예 43.16. 처리기 구성 파일

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>LoggingHandler</handler-name>
      <handler-class>demo.handlers.common.LoggingHandler</handler-class>
    </handler>
    <handler>
      <handler-name>AddHeaderHandler</handler-name>
      <handler-class>demo.handlers.common.AddHeaderHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>

43.10.2. Spring 설정

43.10.2.1. 개요

처리기 체인을 사용하도록 엔드포인트를 구성하는 가장 쉬운 방법은 끝점 구성에서 체인을 정의하는 것입니다. 이 작업은 jaxwxs:handlers 하위를 끝점을 구성하는 요소에 추가하여 수행됩니다.

중요

구성 파일을 통해 추가된 처리기 체인이 프로그래밍 방식으로 구성된 처리기 체인보다 우선합니다.

43.10.2.2. 절차

처리기 체인을 로드하도록 끝점을 구성하려면 다음을 수행합니다.

  1. 끝점에 구성 요소가 없는 경우 하나를 추가합니다.

    Apache CXF 엔드포인트 구성에 대한 자세한 내용은 17장. JAX-WS 엔드포인트 구성 을 참조하십시오.

  2. jaxws:handlers 하위 요소를 엔드포인트의 구성 요소에 추가합니다.
  3. 체인의 각 처리기에 대해 처리기를 구현하는 클래스를 지정하는 빈 요소를 추가합니다.

    처리기 구현을 두 개 이상의 위치에서 사용하는 경우 ref 요소를 사용하여 요소를 참조할 수 있습니다.

43.10.2.3. handlers 요소

jaxws:handlers 요소는 끝점의 구성에 처리기 체인을 정의합니다. 모든 JAX-WS 엔드포인트 구성 요소에 자식으로 표시될 수 있습니다. 다음은 다음과 같습니다.

  • jaxws:endpoint 는 서비스 공급자를 구성합니다.
  • jaxws:server 도 서비스 공급자를 구성합니다.
  • jaxws:client 는 서비스 소비자를 구성합니다.

다음 두 가지 방법 중 하나로 처리기 체인에 핸들러를 추가합니다.

  • 구현 클래스를 정의 하는 빈 요소 추가
  • ref 요소를 사용하여 구성 파일의 다른 위치에서 이름이 지정 된 빈 요소를 참조합니다.

핸들러가 구성에 정의된 순서는 실행할 순서입니다. 논리 처리기와 프로토콜 처리기를 혼합하면 순서가 수정될 수 있습니다. 런타임은 구성에 지정된 기본 순서를 유지하면서 이를 적절한 순서로 정렬합니다.

43.10.2.4. 예제

예 43.17. “Handler Chain In Spring을 사용하도록 엔드 포인트 구성” 핸들러 체인을 로드하는 서비스 공급자의 구성을 보여줍니다.

예 43.17. Handler Chain In Spring을 사용하도록 엔드 포인트 구성

<beans ...
  xmlns:jaxws="http://cxf.apache.org/jaxws"
  ...
  schemaLocation="...
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    ...">
  <jaxws:endpoint id="HandlerExample"
                  implementor="org.apache.cxf.example.DemoImpl"
                  address="http://localhost:8080/demo">
    <jaxws:handlers> <bean class="demo.handlers.common.LoggingHandler" /> <bean class="demo.handlers.common.AddHeaderHandler" /> </jaxws:handlers>
  </jaws:endpoint>
</beans>