2016-06-07 4 views
1

Jboss Fuse 6.2.1을 사용하여 Apache Camel에서 머리를 감싸려고하고 있는데 SOAP 헤더가 어떻게 처리되는지 이해할 수 없습니다.Camel-CXF에서 SOAP 헤더는 어떻게 처리됩니까?

입력 및 출력 메시지에 대한 클래스를 생성 한 WSDL이 있습니다. 입력은 머리글과 본문으로 구성되며 출력은 본문으로 만 구성됩니다.

WSDL

<wsdl:types> 
    <xs:schema targetNamespace="http://cxftestserver.blueprint.me.com"> 
     <xs:element name="input"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element type="xs:string" name="Id" /> 
        <xs:element type="xs:string" name="Name" /> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="output"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element type="xs:string" name="Code" /> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:schema> 
    <xs:schema targetNamespace="http://cxftestserver.blueprint.me.com/authentication"> 
     <xs:element name="authHeader"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element type="xs:string" name="username" /> 
        <xs:element type="xs:string" name="password" /> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:schema> 
</wsdl:types> 

<wsdl:message name="inputTest"> 
    <wsdl:part name="header" element="tns1:authHeader" /> 
    <wsdl:part name="body" element="tns:input" /> 
</wsdl:message> 
<wsdl:message name="outputTest"> 
    <wsdl:part name="out" element="tns:output" /> 
</wsdl:message> 

청사진

<bean id="myProcessor" class="com.me.blueprint.cxftestserver.MyProcessor" /> 

<cxf:cxfEndpoint id="test-ws" address="/Test" serviceClass="com.me.blueprint.cxftestserver.TestEndpoint" /> 

<camel:camelContext> 
    <camel:route> 
     <camel:from uri="cxf:bean:test-ws" /> 
     <camel:process ref="myProcessor" /> 
    </camel:route> 
</camel:camelContext> 

지금은 이해 내부 거래소의 메시지 바디가 authHeader 및 입력을 모두 포함되지 않는 이유는 무엇? 나는이 문서에서 읽은 모든 예제는 내가 수행하여 헤더를 추출 할 수 있어야한다고 제안 :

exchange.getIn().getHeaders(//insert your favorite parameter here); 

을하지만 난 것을 시도했습니다 때마다 항상 null을 반환합니다. 마지막으로 Message-body에 SOAP-header와 SOAP-body를 둘 다 담고있는 MessageContentsList-object가 포함 된 것을 발견했을 때 몇 시간을 모두 낭비했습니다.

Message inMessage = e.getIn(); 
AuthHeader header = inMessage.getBody(AuthHeader.class); 
Input body = inMessage.getBody(Input.class); 

왜 이런 일이 발생했는지 설명해주세요.

답변

1

:

이제는 데이터 형식으로 POJO를 사용할 때 소비자 엔드 포인트가 요청한 메소드가 어떤 매개 변수를 가지고 있는지 살펴 봅니다. SEI (Service Endpoint Interface (serviceClass- 속성 포인트).

이러한 매개 변수는 메시지 본문 (MessageContentsList-object)에 호출되어 헤더와 본문이 모두 존재하는 이유를 설명합니다.

1

모두는 사용하려는 dataFormat에 따라 다릅니다 (예 : dataFormat = MESSAGE를 사용하는 경우). 그러면 교환기에서 들어오는 메시지 전체를 볼 수 있습니다. 기본적으로 헤더를 포함한 전체 메시지가 문자열로 올 것입니다. xpath를 사용하여 바로 처리 할 수 ​​있습니다.

은 DataFormats의이 예를 참조하십시오 - https://github.com/gnanagurus/camel-guru-projects/blob/master/camel-cxf-geocoder-example/src/main/resources/META-INF/spring/beans-config.xml

을하지만이 제안대로하는 것도 맞다, 당신은() 대해 getHeaders를 사용하여 추출 할 수 있습니다. 이 예제에서 언급 한 것처럼 CXF 끝점을 구성 할 수 있습니까? & dataFormat을 'PAYLOAD'로 설정하십시오. (기본적으로 페이로드 (PAYLOAD)에서는 비누 바디를 교환 본문으로 사용하고 헤더는 사용합니다.) getHeaders()를 사용하여 헤더를 읽을 수 있습니다.

또한 서비스 클래스를 사용하여 CXF 엔드 포인트를 정의한 이유는 무엇입니까/왜 클래스를 생성해야합니까? 이유가 없다면 낙타 프로젝트에서 수업을 피하는 경향이 있습니다. XML 자체에서 프레임 워크 기능을 사용하는 것이 가장 좋습니다.당신이 낙타를 사용하여 SOAP 기반의 웹 서비스 엔드 포인트를 노출 할 경우, 당신은 어떤 클래스를 직접 생성 할 필요가 없습니다 -이 예제는/​​도움말을 주도 할 수 있습니다 :

https://github.com/gnanagurus/camel-guru-projects/tree/master/camel-cxf-geocoder-example

위의 예제에 대한 설명 : http://bushorn.com/camel-web-services-expose-them/

행운 내가 내 최초의 질문에 대한 답을 찾았 생각

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 지금 어디에서 그것을 발견하는지 알기 때문에 나의 머리말이 가공되고있는 방식으로 나에게 문제가되지 않는다고 덧붙여 야한다. 헤더가 헤더 대신 메시지 본문에서 발견되는 이유를 이해하지 못합니다. 필자는 약 1 주일 동안 Camel과 함께 놀았으므로 아직 모든 데이터 형식을 탐색 할 시간이 없었지만 확실하게 POJO가 MESSAGE 및 PAYLOAD보다 선호되는 시나리오가 있어야합니까? – noMad17

+0

필자는 페이로드 유형이 무엇을 선호하는지에 달려 있다고 생각합니다. 항상 낙타와 함께 xslt를 사용하는 것을 선호합니다. 현재 내 서비스는 대부분 내부 용이므로 데이터 형식 MESSAGE + XSLT가 좋은 선택이며, 더 눈에 잘.니다. – gnanagurus