43.5. SOAP 핸들러에서 메시지 처리
43.5.1. 개요
일반 메시지 처리는 handleMessage()
메서드에서 처리됩니다.
handleMessage()
메서드는 메시지 본문에 대한 액세스를 SOAPMessage
개체 및 메시지와 연결된 SOAP 헤더로 제공하는 SOAPMessageContext
개체를 수신합니다. 또한 컨텍스트는 메시지 컨텍스트에 저장된 모든 속성에 대한 액세스를 제공합니다.
handleMessage()
메서드는 메시지 처리를 계속하는 방법에 따라 true 또는 false를 반환합니다. 또한 예외를 throw할 수 있습니다.
43.5.2. 메시지 본문으로 작업
SOAP 메시지 컨텍스트의 getMessage()
메서드를 사용하여 SOAP 메시지를 가져올 수 있습니다. 메시지를 라이브 SOAPMessage
개체로 반환합니다. 처리기에서 메시지의 변경 사항은 컨텍스트에 저장된 메시지에 자동으로 반영됩니다.
기존 메시지를 새 메시지로 교체하려면 컨텍스트의 setMessage()
메서드를 사용할 수 있습니다. setMessage()
메서드는 SOAPMessage
개체를 사용합니다.
43.5.3. SOAP 헤더를 가져옵니다.Gets the SOAP headers
SOAPMessage
개체의 getHeader()
메서드를 사용하여 SOAP 메시지의 헤더에 액세스할 수 있습니다. 그러면 처리하려는 헤더 요소를 찾기 위해 검사해야 하는 SOAPHeader
개체로 SOAP 헤더가 반환됩니다.
SOAP 메시지 컨텍스트는 예 43.10. “SOAPMessageContext.getHeaders()
메서드” 에 표시된 getHeaders()
메서드를 제공합니다. 이 메서드는 지정된 SOAP 헤더에 대해 JAXB 개체를 포함하는 배열을 반환합니다.
예 43.10. SOAPMessageContext.getHeaders()
메서드
Ojbect[]
getHeaders
QName
헤더
JAXBContext
컨텍스트
부울
allRoles
요소의 QName을 사용하여 헤더를 지정합니다. allRoles
매개변수를 false로 설정하여 반환된 헤더를 추가로 제한할 수 있습니다. 즉, 런타임에서 활성 SOAP 역할에 적용할 수 있는 SOAP 헤더만 반환하도록 지시합니다.
헤더가 없으면 메서드가 빈 배열을 반환합니다.
JAXBContext
오브젝트를 인스턴스화하는 방법에 대한 자세한 내용은 39장. A JAXBContext
오브젝트 사용 을 참조하십시오.
43.5.4. 컨텍스트 속성 작업
논리 처리기에 전달된 SOAP 메시지 컨텍스트는 애플리케이션의 메시지 컨텍스트 인스턴스이며 이 컨텍스트에 저장된 모든 속성에 액세스할 수 있습니다. 핸들러는 APPLICATION
범위와 Handler
범위 모두에서 속성에 액세스할 수 있습니다.
애플리케이션의 메시지 컨텍스트와 마찬가지로 SOAP 메시지 컨텍스트는 Java Map의 하위 클래스입니다. 컨텍스트에 저장된 속성에 액세스하려면 get()
메서드 및 put()
메서드를 사용하여 맵 인터페이스에서 상속됩니다.
기본적으로 논리 핸들러 내부에서 컨텍스트에서 설정한 모든 속성에는 HANDLER
의 범위가 할당됩니다. 애플리케이션 코드가 컨텍스트의 setScope()
메서드를 사용하여 속성 범위를 APPLICATION으로 명시적으로 설정하는 데 필요한 속성에 액세스할 수 있도록 하려면.
메시지 컨텍스트에서 속성 작업에 대한 자세한 내용은 42.1절. “컨텍스트 이해” 을 참조하십시오.
43.5.5. 메시지의 방향을 결정하는 방법How to determine the direction of the message
메시지가 처리기 체인을 통과하는 방향을 아는 것이 종종 중요합니다. 예를 들어 들어오는 메시지에서 나가는 메시지와 strip 헤더에 헤더를 추가하려고 합니다.
메시지의 방향은 메시지 컨텍스트의 아웃바운드 메시지 속성에 저장됩니다. 예 43.11. “SOAP 메시지 컨텍스트에서 메시지 직접 가져오기” 에 표시된 대로 MessageContext.MESSAGE_OUTBOUND_PROPERTY 키를 사용하여 메시지 컨텍스트에서 아웃바운드 메시지 속성을 검색합니다.
예 43.11. SOAP 메시지 컨텍스트에서 메시지 직접 가져오기
Boolean outbound; outbound = (Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
속성은 부울
오브젝트로 저장됩니다. 개체의 부울Value()
메서드를 사용하여 속성 값을 확인할 수 있습니다. 속성이 true로 설정되면 메시지는 아웃바운드입니다.If the property is set to true, the message is outbound. 속성이 false로 설정되면 메시지가 인바운드됩니다.If the property is set to false, the message is inbound.
43.5.6. 반환 값 확인
handleMessage()
메서드가 메시지 처리를 완료하는 방법은 메시지 처리가 진행되는 방식에 직접적인 영향을 미칩니다. 다음 작업 중 하나를 수행하여 완료할 수 있습니다.
-
메시지 처리가 정상적으로 계속되어야 하는 Apache CXF 런타임으로 true 반환 true 신호를 반환합니다. 다음 처리기에 해당
handleMessage()
가 호출되었습니다. 일반적인 메시지 처리가 중지되는 Apache CXF 런타임으로 false-Returning false 신호를 반환합니다. 런타임이 진행되는 방식은 현재 메시지에 사용되는 메시지 교환 패턴에 따라 다릅니다.
요청-응답 메시지 교환의 경우 다음과 같은 일이 발생합니다.
메시지 처리의 방향은 반전됩니다.
예를 들어 서비스 공급자가 요청을 처리하는 경우 메시지가 서비스의 구현 오브젝트로 진행되지 않습니다. 대신 요청을 시작한 소비자로의 반환을 위해 바인딩으로 다시 전송됩니다.
-
새 처리 방향에서 처리기 체인을 따라 있는 모든 메시지 처리기에는 체인에 있는 순서대로
handleMessage()
메서드가 호출됩니다. 메시지가 처리기 체인의 끝에 도달하면 디스패치됩니다.
단방향 메시지 교환의 경우 다음과 같은 일이 발생합니다.
- 메시지 처리가 중지됩니다.
-
이전에 호출한 모든 메시지 핸들러에는
close()
메서드가 호출되었습니다. - 메시지가 디스패치되어 있습니다.
ProtocolException 예외- protocolException 예외 또는 이 예외의 하위 클래스를 throw하여 오류 메시지 처리가 시작되는 Apache CXF 런타임을 신호합니다. 런타임이 진행되는 방식은 현재 메시지에 사용되는 메시지 교환 패턴에 따라 다릅니다.
요청-응답 메시지 교환의 경우 다음과 같은 일이 발생합니다.
- 처리기가 오류 메시지를 아직 생성하지 않은 경우 런타임은 메시지를 오류 메시지로 래핑합니다.
메시지 처리의 방향은 반전됩니다.
예를 들어 서비스 공급자가 요청을 처리하는 경우 메시지가 서비스의 구현 오브젝트로 진행되지 않습니다. 요청이 발생한 소비자의 반환을 위해 바인딩으로 다시 전송됩니다.
-
새 처리 방향에서 처리기 체인을 따라 있는 모든 메시지 처리기에는 체인에 상주하는 순서대로
handleFault()
메서드가 호출됩니다. 오류 메시지가 처리기 체인의 끝에 도달하면 디스패치됩니다.
단방향 메시지 교환의 경우 다음과 같은 일이 발생합니다.
- 처리기가 오류 메시지를 아직 생성하지 않은 경우 런타임은 메시지를 오류 메시지로 래핑합니다.
- 메시지 처리가 중지됩니다.
-
이전에 호출한 모든 메시지 핸들러에는
close()
메서드가 호출되었습니다. - 오류 메시지가 디스패치되어 있습니다.
-
다른 런타임 예외를 throw - ProtocolException 예외 이외의 런타임 예외는 메시지 처리가 중지되는 Apache CXF 런타임을 알리는 신호입니다. 이전에 호출한 모든 메시지 핸들러에는
close()
메서드가 호출되고 예외가 디스패치됩니다. 메시지가 요청-응답 메시지의 일부이면 요청을 시작한 소비자에게 반환되도록 예외를 디스패치합니다.
43.5.7. 예제
예 43.12. “SOAP 핸들러에서 메시지 처리” shows a handleMessage()
implementation that prints the SOAP message to the screen.
예 43.12. SOAP 핸들러에서 메시지 처리
public boolean handleMessage(SOAPMessageContext smc) { PrintStream out; Boolean outbound = (Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (outbound.booleanValue()) { out.println("\nOutbound message:"); } else { out.println("\nInbound message:"); } SOAPMessage message = smc.getMessage(); message.writeTo(out); out.println(); return true; }
예 43.12. “SOAP 핸들러에서 메시지 처리” 의 코드는 다음을 수행합니다.
메시지 컨텍스트에서 아웃바운드 속성을 검색합니다.
메시지 방향을 테스트하고 적절한 메시지를 출력합니다.
컨텍스트에서 SOAP 메시지를 검색합니다.
콘솔에 메시지를 출력합니다.