使用Camel + Spring WS发送SOAP附件?

时间:2011-08-30 14:23:29

标签: java soap spring-ws apache-camel

我一直在尝试使用Camel + SpringWS发送SOAP附件。

以下是我的RouteBuilder类中的代码,端点工作正常我已经有空的SOAP响应:

from("spring-ws:rootqname:{http://www.lala.org/Bean}GetBookRequest?endpointMapping=#endpointMapping").process(new Processor() {

            public void process(Exchange arg0) throws Exception {
                 //SpringWebserviceMessage msg = (SpringWebserviceMessage) arg0.getIn();  // -->  SpringWebserviceMessage  instance
                arg0.getOut().addAttachment("test",new DataHandler(new FileDataSource("c:/CompanyLogo.jpg")));
            }
        });

我也试过通过SpringWebserviceMessage添加附件,但它没有产生任何影响。 有人知道如何使用Camel + SpringWS添加SOAP附件吗?

3 个答案:

答案 0 :(得分:2)

我不喜欢Camel,但我确实记得我必须在带有spring-ws的消息中放置一个SOAP附件。我的诀窍是使用SaajSoapMessage。

以下是有关如何使用java中的spring-ws附加文件的代码:

JAXBElement<ShowCandidateType> responseElement = (JAXBElement<ShowCandidateType>) kandidaatServiceTemplate.marshalSendAndReceive(
objectFactory.createProcessCandidate(processCandidate), 
new WebServiceMessageCallback() {

    public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {

        SaajSoapMessage saajMessage = (SaajSoapMessage) message;

        //Use the file name as the contentId 
        saajMessage.addAttachment(file.getName(), file); 
    } 
}

);

关键是实现doWithMessage并将WebServiceMessage转换为SaajSoapMessage。

答案 1 :(得分:1)

Spring-WS Camel 组件不包含正式发布的任何附件/标头支持。

但是, camel-spring-ws 的最新快照包含解决此问题的补丁。

请看这里:https://issues.apache.org/jira/browse/CAMEL-5724

以下是拟议功能的当前文档

  

标题和附件传播

     

端点将使用所谓的“ hook ”MessageFilter(BasicMessageFilter提供默认实现)将交换头和附件传播到WebSdrviceMessage响应中。

现在你可以使用

exchange.getOut().getHeaders().put("myCustom","myHeaderValue")
exchange.getIn().addAttachment("myAttachment", new DataHandler(...))

注意:如果管道中的交换标头包含文本,它会在soap标头中生成Qname(key)= value属性。

建议直接创建一个QName类,并将任意键放入标题中。

答案 2 :(得分:0)

不知道您的网络服务如何期望附件。我需要使用Camel + Soap发送附件。如果您打算使用'@mtom',则需要添加二进制消息部分,然后需要添加附件,并引用二进制部分。 否则,如果您的Web服务使用base64编码的附件。您只需将文件内容base64编码为消息中的附件字段名称。

如果你可以分享wsdl,我将能够更好地帮助你。