59.3. 프로그래밍 방식으로 인터셉터 추가
59.3.1. 인터셉터 추가 방법
인터셉터는 다음 두 가지 방법 중 하나를 사용하여 프로그래밍 방식으로 엔드포인트에 연결할 수 있습니다.
- InterceptorProvider API
- Java 주석
InterceptorProvider API를 사용하면 개발자가 인터셉터 체인이 있는 런타임 구성 요소에 인터셉터를 연결할 수 있지만 기본 Apache CXF 클래스를 사용해야 합니다. Java 주석은 서비스 인터페이스 또는 서비스 구현에만 추가할 수 있지만 개발자가 Cryostat-WS API 또는 Cryostat-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를 사용하여 런타임 구성 요소의 인터셉터 체인에 인터셉터를 연결하려면 다음을 수행해야 합니다.
인터셉터가 연결되어 있는 체인을 사용하여 런타임 구성 요소에 대한 액세스 권한을 얻습니다.
개발자는 Apache CXF 특정 API를 사용하여 표준 Java 애플리케이션 코드에서 런타임 구성 요소에 액세스해야 합니다. 런타임 구성 요소는 일반적으로 Cryostat-WS 또는 Cryostat-RS 아티팩트를 기본 Apache CXF 오브젝트로 캐스팅하여 액세스할 수 있습니다.
- 인터셉터의 인스턴스를 생성합니다.
- 적절한 get 방법을 사용하여 원하는 인터셉터 체인을 검색합니다.
List
오브젝트의add()
메서드를 사용하여 인터셉터를 인터셉터 체인에 연결합니다.이 단계는 일반적으로 인터셉터 체인을 검색하는 것과 결합됩니다.
59.3.2.3. 소비자에 인터셉터 연결
프로그래밍 방식으로 소비자에 인터셉터 연결 Cryostat-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); ... } }
프로그래밍 방식으로 소비자에 인터셉터 연결 의 코드는 다음을 수행합니다.
소비자에 대한 Cryostat-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가 엔드포인트를 나타내는 데 사용하는 Server
개체를 가져옵니다.
서비스 공급자에 대한 Apache CXF EndpointImpl
개체를 가져옵니다.
인터셉터의 인스턴스를 생성합니다.
인터셉터를 엔드포인트에 연결합니다. 아웃바운드 인터셉터 체인입니다.
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는 개발자가 엔드포인트에서 사용하는 인터셉터 체인을 지정할 수 있는 4가지 Java 주석을 제공합니다. 인터셉터를 엔드포인트에 연결하는 다른 수단과 달리 주석이 애플리케이션 수준 아티팩트에 연결됩니다. 사용되는 아티팩트는 주석의 효과 범위를 결정합니다.
59.3.3.2. 주석을 배치할 위치
주석은 다음 아티팩트에 배치할 수 있습니다.
끝점을 정의하는 서비스 끝점 인터페이스(SEI)
주석이 SEI에 배치되면 인터페이스를 구현하는 모든 서비스 공급자와 SEI를 사용하여 프록시를 생성하는 모든 소비자에 영향을 받습니다.
서비스 구현 클래스
주석이 구현 클래스에 배치되면 구현 클래스를 사용하는 모든 서비스 공급자에 영향을 받습니다.
59.3.3.3. 주석
주석은 모두 org.apache.cxf.interceptor 패키지에 있으며 표 59.2. “인터셉터 체인 주석” 에 설명되어 있습니다.
주석 | 설명 |
---|---|
인바운드 인터셉터 체인의 인터셉터를 지정합니다. | |
아웃바운드 인터셉터 체인의 인터셉터를 지정합니다. | |
인바운드 오류 인터셉터 체인의 인터셉터를 지정합니다. | |
아웃바운드 오류 인터셉터 체인의 인터셉터를 지정합니다. |
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
{
...
}