我已經使用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或其他)。看起來像一個小問題,但...
是啊,我已經給了我的問題該鏈接。但是我對如何使用當前生產版本的駱駝可以做到這一點感興趣。 2.10.0。但也許我將不得不從頭開始構建spring-ws組件... – JohnGray 2012-08-01 05:08:38
對不起,我的壞。更新了答案。 – 2012-08-01 08:27:15