43.10. Handlers를 사용하도록 끝점 구성
43.10.1. 프로그래밍 방식 구성
43.10.1.1. 소비자에 Handler 체인 추가
43.10.1.1.1. 개요
처리기 체인을 소비자에 추가하려면 처리기 체인을 명시적으로 빌드해야 합니다. 그런 다음 서비스 프록시의 Binding
오브젝트에 처리기 체인을 직접 설정합니다.
Spring 구성을 사용하여 구성된 모든 처리기 체인은 프로그래밍 방식으로 구성된 처리기 체인을 재정의합니다.
43.10.1.1.2. 프로세스
사용자에게 처리기 체인을 추가하려면 다음을 수행합니다.
-
처리기 체인을 저장할
List<Handler
> 오브젝트를 생성합니다. - 체인에 추가할 각 처리기의 인스턴스를 생성합니다.
- 런타임에서 호출할 순서대로 각 인스턴스화된 처리기 오브젝트를 목록에 추가합니다.
서비스 프록시에서 Binding 오브젝트를 가져옵니다.
Apache CXF는
org.apache.cxf.jaxws.binding.DefaultBindingImpl
이라는 바인딩 인터페이스의 구현을 제공합니다.-
Binding 오브젝트의
setHandler Cryostat()
메서드를 사용하여 프록시에서 처리기 체인을 설정합니다.
43.10.1.1.3. 예
예 43.14. “소비자에 Handler 체인 추가” 사용자에게 처리기 체인을 추가하기 위한 코드를 표시합니다.
예 43.14. 소비자에 Handler 체인 추가
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. “소비자에 Handler 체인 추가” 의 코드는 다음을 수행합니다.
처리기를 인스턴스화합니다.
체인을 보유할 List
오브젝트를 만듭니다.
체인에 처리기를 추가합니다.
프록시에서 DefaultBindingImpl 개체로 Binding 개체를 가져옵니다.Gets the Binding object from the proxy as a DefaultBindingImpl
object.
처리기 체인을 프록시의 바인딩에 할당합니다.
43.10.1.2. 서비스 공급자에 처리기 체인 추가
43.10.1.2.1. 개요
SEI 또는 구현 클래스를 @Handler
Cryostat 주석으로 데코팅하여 서비스 공급자에 처리기 체인을 추가합니다. 주석은 서비스 공급자가 사용하는 처리기 체인을 정의하는 메타 데이터 파일을 가리킵니다.
43.10.1.2.2. 프로세스
서비스 공급자에 처리기 체인을 추가하려면 다음을 수행합니다.
-
@Handler Cryostat 주석을 사용하여 공급자의 구현 클래스를
분리합니다. - 처리기 체인을 정의하는 처리기 구성 파일을 생성합니다.
43.10.1.2.3. @Handler Cryostat 주석
javax.jws.Handler annotations
는 서비스 공급자의 구현 클래스를 분리합니다. 런타임에서 파일 속성으로 지정된 처리기 체인 구성 파일을 로드하도록 지시합니다.
주석의 file
속성은 로드할 처리기 구성 파일을 식별하는 두 가지 방법을 지원합니다.
- URL
- 상대 경로 이름
예 43.15. “처리기 체인을 로드하는 서비스 구현” 에서는 handlers.xml
이라는 파일에 정의된 처리기 체인을 사용할 서비스 공급자 구현을 표시합니다. handlers.xml
은 서비스 공급자가 실행되는 디렉터리에 있어야 합니다.
예 43.15. 처리기 체인을 로드하는 서비스 구현
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. 처리기 구성 파일
처리기 구성 파일은 구현되는 XML 문법을 사용하여 처리기 체인을 정의합니다(Java EE용 웹 서비스, 버전 1.2). 이 문법은 http://java.sun.com/xml/ns/javaee
에 정의되어 있습니다.
처리기 구성 파일의 root 요소는 handler-chains
요소입니다. handler-chains
요소에는 하나 이상의 handler-chain
요소가 있습니다.
handler-chain
요소는 처리기 체인을 정의합니다. 표 43.1. “Server-Side Handler Chain을 정의하는 데 사용되는 요소” handler-chain
요소의 하위 요소에 대해 설명합니다.
element | 설명 |
---|---|
처리기를 설명하는 요소를 포함합니다. | |
처리기 체인이 바인딩된 | |
처리기 체인이 바인딩된 끝점을 정의하는 WSDL | |
처리기 체인이 사용되는 메시지 바인딩을 지정합니다. 바인딩은 URI로 지정되거나 다음과 같은 별칭을 사용하여 지정됩니다. 메시지 바인딩 URI에 대한 자세한 내용은 23장. Apache CXF 바인딩 ID 을 참조하십시오. |
handler-chain
요소는 단일 handler
요소를 하위로 보유하는 데만 필요합니다. 그러나 전체 처리기 체인을 정의하는 데 필요한 만큼의 처리기
요소를 지원할 수 있습니다. 체인의 처리기는 처리기 체인 정의에 지정된 순서로 실행됩니다.
실행 최종 순서는 지정된 처리기를 논리 처리기 및 프로토콜 처리기로 정렬하여 결정됩니다. 그룹화 내에서 구성에 지정된 순서가 사용됩니다.
protocol-binding
과 같은 다른 자식은 정의된 처리기 체인의 범위를 제한하는 데 사용됩니다. 예를 들어 service-name-pattern
요소를 사용하는 경우 처리기 체인은 WSDL 포트
요소가 지정된 WSDL 서비스 요소의 자식인 서비스
공급자에만 연결됩니다. 이러한 제한 하위 중 하나만 handler
요소에서 사용할 수 있습니다.
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. 프로세스
처리기 체인을 로드하도록 끝점을 구성하려면 다음을 수행합니다.
끝점에 구성 요소가 없는 경우 하나를 추가합니다.
Apache CXF 끝점 구성에 대한 자세한 내용은 17장. Cryostat-WS 끝점 구성 을 참조하십시오.
-
jaxws:handlers
하위 요소를 끝점의 구성 요소에 추가합니다. 체인의 각 처리기에 대해 처리기를 구현하는 클래스를 지정하는ans 요소를 추가합니다.
처리기 구현이 둘 이상의 위치에서 사용되는 경우
ref
요소를 사용하여 8080요소를
참조할 수 있습니다.
43.10.2.3. handlers 요소
jaxws:handlers
요소는 엔드포인트 구성에서 처리기 체인을 정의합니다. 모든 Cryostat-WS 엔드포인트 구성 요소에 자식으로 표시될 수 있습니다. 다음은 다음과 같습니다.
-
jaxws:endpoint
는 서비스 공급자를 구성합니다. -
jaxws:server
도 서비스 공급자를 구성합니다. -
jaxws:client
는 서비스 소비자를 구성합니다.
다음 두 가지 방법 중 하나로 처리기를 처리기 체인에 추가합니다.
-
구현 클래스
를
정의하는 Quarkus 요소 추가 -
ref
요소를 사용하여 구성 파일의 다른위치에서
이름이 지정된 8080 요소를 참조합니다.
핸들러가 구성에 정의된 순서는 해당 핸들러가 실행될 순서입니다. 논리 처리기와 프로토콜 처리기를 혼합하면 순서가 변경될 수 있습니다. 런타임은 구성에 지정된 기본 순서를 유지하면서 적절한 순서로 정렬합니다.
43.10.2.4. 예
예 43.17. “Spring에서 처리기 체인을 사용하도록 끝점 구성” 처리기 체인을 로드하는 서비스 공급자에 대한 구성이 표시됩니다.
예 43.17. 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>