42장. 컨텍스트 작업
초록
JAX-WS는 컨텍스트를 사용하여 메시징 체인과 함께 메타데이터를 전달합니다. 이 메타데이터는 범위에 따라 구현 수준 코드에서 액세스할 수 있습니다. 구현 수준 아래의 메시지에서 작동하는 JAX-WS 핸들러에도 액세스할 수 있습니다.
42.1. 컨텍스트 이해
42.1.1. 개요
대부분의 경우 메시지에 대한 정보를 애플리케이션의 다른 부분에 전달해야 합니다. Apache CXF는 컨텍스트 메커니즘을 사용하여 이 작업을 수행합니다. 컨텍스트는 발신 또는 들어오는 메시지와 관련된 속성을 보유하는 맵입니다. 컨텍스트에 저장된 속성은 일반적으로 메시지에 대한 메타데이터이며 메시지를 전달하는 데 사용되는 기본 전송입니다. 예를 들어 HTTP 응답 코드 또는 JMS 상관 ID와 같은 메시지를 전송하는 데 사용되는 전송별 헤더는 JAX-WS 컨텍스트에 저장됩니다.
컨텍스트는 JAX-WS 애플리케이션의 모든 수준에서 사용할 수 있습니다. 그러나 메시지 처리 스택에서 컨텍스트에 액세스하는 위치에 따라 미묘한 방식으로 다릅니다. JAX-WS Handler 구현은 컨텍스트에 직접 액세스할 수 있으며 여기에 설정된 모든 속성에 액세스할 수 있습니다. 서비스 구현에서는 삽입된 컨텍스트를 사용하여 컨텍스트에 액세스하고 APPLICATION
범위에 설정된 속성만 액세스할 수 있습니다. 소비자 구현은 APPLICATION
범위에 설정된 속성만 액세스할 수 있습니다.
그림 42.1. “메시지 컨텍스트 및 메시지 처리 경로” 는 컨텍스트 속성이 Apache CXF를 통과하는 방법을 보여줍니다. 메시지가 메시징 체인을 통과하면 관련 메시지 컨텍스트가 함께 전달됩니다.
그림 42.1. 메시지 컨텍스트 및 메시지 처리 경로
42.1.2. 속성을 컨텍스트에 저장하는 방법How properties are stored in a context
메시지 컨텍스트는 javax.xml.ws.handler.MessageContext 인터페이스의 모든 구현입니다. MessageContext 인터페이스는 java.util.Map<String 키, Object value> 인터페이스를 확장합니다. 맵 오브젝트는 키 값 쌍으로 정보를 저장합니다.
메시지 컨텍스트에서 속성은 이름/값 쌍으로 저장됩니다. 속성의 키는 속성을 식별하는 문자열
입니다. 속성 값은 Java 오브젝트에 저장된 모든 값일 수 있습니다. 메시지 컨텍스트에서 값을 반환하는 경우 애플리케이션에서 예상하고 캐스팅할 유형을 알아야 합니다. 예를 들어 속성 값이 UserInfo 개체에 저장된 경우 UserInfo
개체로 다시 캐스팅해야 하는 개체로 메시지 컨텍스트에서 계속 반환됩니다.For example, if a property's value is stored in a UserInfo object it is still returned from a message context as an Object
that must be cast back into a UserInfo
object.
메시지 컨텍스트의 속성도 범위가 있습니다. 범위는 메시지 처리 체인에서 속성에 액세스할 수 있는 위치를 결정합니다.
42.1.3. 속성 범위
메시지 컨텍스트의 속성은 범위가 지정됩니다. 속성은 다음 범위 중 하나일 수 있습니다.
애플리케이션
-
APPLICATION
으로 범위가 지정된 속성은 JAX-WS Handler 구현, 소비자 구현 코드 및 서비스 공급자 구현 코드에서 사용할 수 있습니다. 처리기가 서비스 공급자 구현에 속성을 전달해야 하는 경우 속성의 범위를 APPLICATION으로 설정합니다.If a handler needs to pass a property to the service provider implementation, it sets the property's scope toAPPLICATION
. 소비자 구현 또는 서비스 공급자 구현 컨텍스트에서 설정된 모든 속성은 자동으로APPLICATION
으로 범위가 지정됩니다. HANDLER
-
HANDLER
로 범위가 지정된 속성은 JAX-WS Handler 구현에서만 사용할 수 있습니다. 핸들러 구현에서 메시지 컨텍스트에 저장된 속성은 기본적으로HANDLER
로 범위가 지정됩니다.
메시지 컨텍스트의 setScope()
메서드를 사용하여 속성 범위를 변경할 수 있습니다. 예 42.1. “The MessageContext.setScope()
Method” 메서드의 서명을 표시합니다.
예 42.1. The MessageContext.setScope()
Method
SetScope
String
key
MessageContext.Scope
범위
java.lang.IllegalArgumentException
첫 번째 매개 변수는 속성의 키를 지정합니다. 두 번째 매개 변수는 속성의 새 범위를 지정합니다. 범위는 다음 중 하나일 수 있습니다.
-
MessageContext.Scope.APPLICATION
-
MessageContext.Scope.HANDLER
42.1.4. 핸들러의 컨텍스트 개요
JAX-WS Handler 인터페이스를 구현하는 클래스는 메시지의 컨텍스트 정보에 직접 액세스할 수 있습니다. 메시지의 컨텍스트 정보는 Handler 구현의 handleMessage()
, handleFault()
및 close()
메서드로 전달됩니다.
핸들러 구현은 해당 범위에 관계없이 메시지 컨텍스트에 저장된 모든 속성에 액세스할 수 있습니다. 또한 논리 핸들러는 LogicalMessageContext
라는 특수 메시지 컨텍스트를 사용합니다. LogicalMessageContext
개체에는 메시지 본문의 콘텐츠에 액세스하는 메서드가 있습니다.
42.1.5. 서비스 구현의 컨텍스트 개요
서비스 구현은 메시지 컨텍스트에서 APPLICATION
으로 범위가 지정된 속성에 액세스할 수 있습니다. 서비스 공급자의 구현 오브젝트는 WebServiceContext 오브젝트를 통해 메시지 컨텍스트에 액세스합니다.
자세한 내용은 42.2절. “서비스 구현에서 컨텍스트 작업” 에서 참조하십시오.
42.1.6. 소비자 구현의 컨텍스트 개요
소비자 구현은 메시지 컨텍스트의 콘텐츠에 대한 간접 액세스 권한을 갖습니다. 소비자 구현에는 두 개의 별도의 메시지 컨텍스트가 있습니다.
- 요청 컨텍스트 - 나가는 요청에 사용되는 속성 사본을 보유합니다.
- 응답 컨텍스트 - 들어오는 응답에서 속성 사본을 보유합니다.
디스패치 계층은 소비자 구현의 메시지 컨텍스트와 Handler 구현에서 사용하는 메시지 컨텍스트 간에 속성을 전송합니다.
소비자 구현에서 요청이 디스패치 계층에 전달되면 요청 컨텍스트의 콘텐츠가 디스패치 계층에서 사용하는 메시지 컨텍스트로 복사됩니다. 서비스에서 응답이 반환되면 디스패치 계층에서 메시지를 처리하고 적절한 속성을 메시지 컨텍스트로 설정합니다. 디스패치 계층에서 응답을 처리한 후 메시지 컨텍스트에서 APPLICATION
으로 범위가 지정된 모든 속성을 소비자 구현의 응답 컨텍스트에 복사합니다.
자세한 내용은 42.3절. “소비자 구현에서 컨텍스트 작업” 에서 참조하십시오.