59.3. 프로그래밍 방식으로 인터셉터 추가

59.3.1. Interceptors 추가 방법

인터셉터는 다음 두 가지 방법 중 하나를 사용하여 프로그래밍 방식으로 끝점에 연결할 수 있습니다.

  • InterceptorProvider API
  • Java 주석

InterceptorProvider API를 사용하면 개발자가 인터셉터 체인이 있는 런타임 구성 요소에 인터셉터를 연결할 수 있지만 기본 Apache CXF 클래스로 작업해야 합니다. Java 주석은 서비스 인터페이스 또는 서비스 구현에만 추가할 수 있지만 개발자는 JAX-WS API 또는 JAX-RS API 내에 있을 수 있습니다.

59.3.2. 인터셉터 공급자 API 사용

59.3.2.1. 개요

인터셉터는 인터셉터 공급자 인터페이스 에 표시된 InterceptorProvider 인터페이스를 구현하는 모든 구성 요소로 등록할 수 있습니다.

인터셉터 공급자 인터페이스

package org.apache.cxf.interceptor;

import java.util.List;

public interface InterceptorProvider
{
    List<Interceptor<? extends Message>> getInInterceptors();

    List<Interceptor<? extends Message>> getOutInterceptors();

    List<Interceptor<? extends Message>> getInFaultInterceptors();

    List<Interceptor<? extends Message>> getOutFaultInterceptors();
}

인터페이스의 네 가지 방법을 사용하면 각 엔드포인트의 인터셉터 체인을 Java List 오브젝트로 검색할 수 있습니다. 개발자는 Java List 오브젝트에서 제공하는 방법을 사용하여 모든 체인에 인터셉터를 추가하고 제거할 수 있습니다.

59.3.2.2. 절차

InterceptorProvider API를 사용하여 런타임 구성 요소의 인터셉터 체인에 인터셉터를 연결하려면 다음을 수행해야 합니다.

  1. 인터셉터를 연결할 체인으로 런타임 구성 요소에 대한 액세스 권한을 가져옵니다.

    개발자는 Apache CXF 특정 API를 사용하여 표준 Java 애플리케이션 코드에서 런타임 구성 요소에 액세스해야 합니다. 일반적으로 런타임 구성 요소는 JAX-WS 또는 JAX-RS 아티팩트를 기본 Apache CXF 개체로 캐스팅하여 액세스할 수 있습니다.

  2. 인터셉터의 인스턴스를 생성합니다.
  3. 적절한 get 방법을 사용하여 원하는 인터셉터 체인을 검색합니다.
  4. List 오브젝트의 add() 메서드를 사용하여 인터셉터를 인터셉터 체인에 연결합니다.

    이 단계는 일반적으로 인터셉터 체인 검색과 결합됩니다.

59.3.2.3. 소비자에게 인터셉터 연결

프로그래밍 방식으로 사용자에게 인터셉터 연결 JAX-WS 소비자의 인바운드 인터셉터 체인에 인터셉터를 연결하는 코드를 보여줍니다.

프로그래밍 방식으로 사용자에게 인터셉터 연결

package com.fusesource.demo;

import java.io.File;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import org.apache.cxf.endpoint.Client;

public class Client
{
  public static void main(String args[])
  {
    QName serviceName = new QName("http://demo.eric.org", "stockQuoteReporter");
    Service s = Service.create(serviceName);

    QName portName = new QName("http://demo.eric.org", "stockQuoteReporterPort");
    s.addPort(portName, "http://schemas.xmlsoap.org/soap/", "http://localhost:9000/EricStockQuote");

    quoteReporter proxy = s.getPort(portName, quoteReporter.class);

    Client cxfClient = (Client) proxy;

    ValidateInterceptor validInterceptor = new ValidateInterceptor();
    cxfClient.getInInterceptor().add(validInterceptor);

    ...
  }
}

프로그래밍 방식으로 사용자에게 인터셉터 연결 의 코드는 다음을 수행합니다.

소비자에 대한 JAX-WS Service 오브젝트를 만듭니다.

소비자의 대상 주소를 제공하는 Service 오브젝트에 포트를 추가합니다.

서비스 공급자에서 메서드를 호출하는 데 사용되는 프록시를 생성합니다.

프록시를 org.apache.cxf.endpoint.Client 유형으로 캐스팅합니다.

인터셉터의 인스턴스를 생성합니다.

인바운드 인터셉터 체인에 인터셉터를 연결합니다.

59.3.2.4. 서비스 공급자에 인터셉터 연결

프로그래밍 방식으로 서비스 공급자에 인터셉터 연결 서비스 공급자의 아웃바운드 인터셉터 체인에 인터셉터를 연결하는 코드를 보여줍니다.

프로그래밍 방식으로 서비스 공급자에 인터셉터 연결

package com.fusesource.demo;
import java.util.*;

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.frontend.EndpointImpl;

public class stockQuoteReporter implements quoteReporter
{
  ...
  public stockQuoteReporter()
  {
    ServerFactoryBean sfb = new ServerFactoryBean();
    Server server = sfb.create();
    EndpointImpl endpt = server.getEndpoint();

    AuthTokenInterceptor authInterceptor = new AuthTokenInterceptor();

    endpt.getOutInterceptor().add(authInterceptor);
  }
}

프로그래밍 방식으로 서비스 공급자에 인터셉터 연결 의 코드는 다음을 수행합니다.

기본 Apache CXF 개체에 대한 액세스를 제공할 ServerFactoryBean 개체를 만듭니다.

Apache CXF가 엔드포인트를 나타내는 데 사용하는 서버 개체를 가져옵니다.

서비스 공급자의 Apache CXF EndpointImpl 오브젝트를 가져옵니다.

인터셉터의 인스턴스를 생성합니다.

인터셉터를 끝점에 연결합니다.s 아웃바운드 인터셉터 체인.

59.3.2.5. 버스에 인터셉터 연결

버스에 인터셉터 연결 는 인터셉터를 버스의 인바운드 인터셉터 체인에 연결하는 코드를 보여줍니다.

버스에 인터셉터 연결

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

...

Bus bus = BusFactory.getDefaultBus();

WatchInterceptor watchInterceptor = new WatchInterceptor();

bus..getInInterceptor().add(watchInterceptor);

...

버스에 인터셉터 연결 의 코드는 다음을 수행합니다.

런타임 인스턴스의 기본 버스를 가져옵니다.

인터셉터의 인스턴스를 생성합니다.

인바운드 인터셉터 체인에 인터셉터를 연결합니다.

WatchInterceptor 는 런타임 인스턴스에서 생성된 모든 엔드포인트의 인바운드 인터셉터 체인에 연결됩니다.

59.3.3. Java 주석 사용

59.3.3.1. 개요

Apache CXF는 개발자가 엔드포인트에서 사용하는 인터셉터 체인을 지정할 수 있는 네 가지 Java 주석을 제공합니다. 인터셉터를 끝점에 연결하는 다른 방법과 달리 주석은 애플리케이션 수준 아티팩트에 연결됩니다. 사용되는 아티팩트는 주석의 적용 범위를 결정합니다.

59.3.3.2. 주석을 배치할 위치

주석은 다음 아티팩트에 배치할 수 있습니다.

  • 끝점을 정의하는 서비스 끝점 인터페이스(SEI)

    주석이 SEI에 배치되면 인터페이스를 구현하는 모든 서비스 공급자와 SEI를 사용하여 프록시를 생성하는 모든 소비자에 영향을 미칩니다.

  • 서비스 구현 클래스

    주석이 구현 클래스에 배치되면 구현 클래스를 사용하는 모든 서비스 공급자가 영향을 받습니다.

59.3.3.3. 주석

주석은 모두 org.apache.cxf.interceptor 패키지이며 표 59.2. “인터셉터 체인 주석” 에 설명되어 있습니다.

표 59.2. 인터셉터 체인 주석

주석설명

InInterceptors

인바운드 인터셉터 체인의 인터셉터를 지정합니다.

OutInterceptors

아웃바운드 인터셉터 체인의 인터셉터를 지정합니다.

InFaultInterceptors

인바운드 fault 인터셉터 체인의 인터셉터를 지정합니다.

OutFaultInterceptors

아웃바운드 fault 인터셉터 체인의 인터셉터를 지정합니다.

59.3.3.4. 인터셉터 나열

인터셉터 목록은 체인 주석의 인터셉터 나열 구문 에 표시된 구문을 사용하여 정규화된 클래스 이름 목록으로 지정됩니다.

체인 주석의 인터셉터 나열 구문

interceptors={"interceptor1", "interceptor2", ..., "interceptorN"}

59.3.3.5. 예제

서비스 구현에 인터셉터 연결 SayHiImpl 에서 제공하는 논리를 사용하는 엔드포인트의 인바운드 인터셉터 체인에 두 개의 인터셉터를 연결하는 주석을 표시합니다.

서비스 구현에 인터셉터 연결

import org.apache.cxf.interceptor.InInterceptors;

@InInterceptors(interceptors={"com.sayhi.interceptors.FirstLast", "com.sayhi.interceptors.LogName"})
public class SayHiImpl implements SayHi
{
  ...
}