我一直在尝试使用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附件吗?
答案 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,我将能够更好地帮助你。