2

我已经使用 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 或其他东西)。似乎是一个小问题,但...

4

2 回答 2

1

似乎是附加补丁的问题,可能会解决此问题。

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

您可能只实现自己的组件,该组件源自 camel-spring-ws(虽然没有测试过)。

在您覆盖的 SpringWebServiceConsumer 中添加标头设置(从交换复制)。在您覆盖的 SpringWebServiceEndpoint 覆盖 createConsumer 以创建您的自定义消费者。在您覆盖的 SpringWebServiceComponent 覆盖 createEndpoint 以创建您的自定义端点。

应该做的伎俩,也许与它周围的一些其他代码。然后只需从您的新组件创建您的路线。

您可能想下载骆驼源代码并查看 spring ws 组件,其中的代码并不多。

于 2012-07-31T14:35:28.807 回答
1

不幸的是,当前的实现不支持多个 SOAP 标头。我是说:

<soap-env:Header>
<MyFirstHeader>...</MyFirstHeader>
<MySecondHeader>...</MySecondHeader>
</soap-env:Header>

如何提交补丁?

顺便说一句,Spring-WS 方面有一个解决方法:http: //leakfromjavaheap.blogspot.com/2014/05/multiple-soap-headers-in-apache-camels.html

于 2014-05-22T19:46:41.077 回答