2012-07-31 68 views
1

我已經使用Spring DSL配置了Camel SOAP代理服務。一切都很好,直到我發現我需要爲SOAP響應消息設置一個自定義頭部。駱駝春天-WS。設置自定義SOAP標頭

我使用spring-ws組件和最新的Camel 2.10.0。

這裏是我的春天路徑的一個例子(我跳過一些無關緊要的轉換):

<bean id="ahc_binding" class="ru.fabit.ExampleAHCBinding"/> 

<bean id="response_assembler" class="ru.fabit.ExampleResponseAssembler"/> 

<camel:camelContext id="get_regions"> 

    <camel:dataFormats> 
     <camel:jaxb id="main_jaxb" prettyPrint="true" 
        contextPath="ru.fabit.rosstelecom.webservice.models.smev" /> 
    </camel:dataFormats> 

    <camel:route> 
     <camel:from uri="spring-ws:rootqname:{http://fabit.ru/service}getRegionsRequest?endpointMapping=#endpointMapping"/> 

     <camel:unmarshal ref="main_jaxb"/> 

     <camel:to uri="ahc:http://localhost:9001/service/regions"/> 

     <camel:unmarshal ref="main_jaxb"/> 

     <camel:process ref="response_assembler"/> 

    </camel:route> 
</camel:camelContext> 

這裏是ExampleResponseAssembler.java(「response_assembler」豆)的代碼。這是路線中的最後一個元素。並且有責任從一些外部服務(實際上來自AHC組件)獲得未編組響應對象,併爲整個路由組裝正確的SOAP響應。

public class ExampleResponseAssembler implements Processor { 

    @Override 
    public void process(final Exchange exchange) throws Exception { 

     final Object responseMessage = exchange.getIn().getBody(); 
     final GetRegionsResponse regionsResponse = new GetRegionsResponse(); 
     final MessageDataType messageData = new MessageDataType(); 
     final AppDataType appData = new AppDataType(); 

     appData.setAny(responseMessage); 
     messageData.setAppData(appData); 
     regionsResponse.setMessageData(messageData); 

     exchange.getOut().setBody(regionsResponse); 

     final HeaderType header = exchange.getProperty("exampleHeader", HeaderType.class); 
     exchange.getOut().setHeader("CamelSpringWebServiceSoapHeader", header); 
    } 
} 

當我以這種方式設置身體正確解析它。我可以在SaopUI中看到它。但標題不在那裏。我猜這是設置SOAP標頭的一種天真的方法。 而我無法找到任何有關此信息。

儘管我能夠找到一些有關此問題的JIRA票 - link,但是仍然不清楚如何處理設置一些自定義SOAP標頭。票證被標記爲「未解決」。 也許我需要在這裏重寫voodoo magick(重寫MessageFactory,MessageSender或其他)。看起來像一個小問題,但...

回答

1

似乎是一個問題,附加的修補程序,可能會解決這個問題。

https://issues.apache.org/jira/browse/CAMEL-4515

你很可能只是實現自己的組件,從駱駝彈簧-WS(雖然不是測試它)派生的。

在您的overrided SpringWebServiceConsumer添加標題的設置(從交換複製)。 在您的overrogided SpringWebServiceEndpoint覆蓋createConsumer創建您的自定義使用者。 在您的overrogided SpringWebServiceComponent重寫createEndpoint來創建您的自定義端點。

應該做的伎倆,也許與其他一些代碼。 然後從你的新組件創建你的路線。

你可能想下載駱駝源碼,看看spring ws組件,它並不是那麼多的代碼。

+0

是啊,我已經給了我的問題該鏈接。但是我對如何使用當前生產版本的駱駝可以做到這一點感興趣。 2.10.0。但也許我將不得不從頭開始構建spring-ws組件... – JohnGray 2012-08-01 05:08:38

+0

對不起,我的壞。更新了答案。 – 2012-08-01 08:27:15