我已经使用 Spring DSL 配置了 Camel SOAP 代理服务。一切都很好,直到我发现我需要在里面为 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”bean)的代码。它是路线中的最后一个元素。并且有责任从某些外部服务(实际上是从 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);
}
}
当我以这种方式设置 Body 时,它会被正确解析。我可以在 SaopUI 中看到它。但标题不存在。我猜这是设置 SOAP 标头的一种天真的方法。而且我找不到任何相关信息。
尽管我能够找到一些关于此问题的 JIRA 票证 -链接,但仍不清楚如何处理设置一些自定义 SOAP 标头。并且工单被标记为“未解决”。也许我在这里需要一些覆盖巫毒魔法(覆盖 MessageFactory、MessageSender 或其他东西)。似乎是一个小问题,但...