Spring-WS中的文档特别关注此主题,添加SOAP附件实际上非常容易。我将做一些假设:
- 您的WSDL正确指定
mime:multipartRelated
了输出消息上的 - 我们将使用Saaj SOAP消息工厂
附件驻留在SOAP消息的MimeContainer中。为了获得此容器,我们需要手动构造SOAP响应,只是其中的一部分。这样做看起来像这样:
SaajSoapMessageFactory factory = new SaajSoapMessageFactory( javax.xml.soap.MessageFactory.newInstance());SaajSoapMessage message = factory.createWebServiceMessage();
现在,我们需要一个DataHandler作为图片:
DataHandler handler = new DataHandler( new URLDataSource( Service.class.getResource("coffee.jpg")));message.addAttachment("picture", handler);好的,内容:检查,消息:检查,嗯,仍然需要得到响应才能出去。这里最棘手的部分是,我们需要引入,
MessageContext以便我们可以将 这一
特定消息设置为响应的消息,我们可以通过编辑以下内容的定义来做到这一点
getCoffee:
public Coffee getCoffee(@RequestPayload Order order, MessageContext context)
放在一起:
@Endpointpublic class Service{ private SaajSoapMessageFactory saajMessageFactory; // dependency inject this @PayloadRoot(namespace = "http://foo.com/coffee", localPart = "order") @ResponsePayload public Coffee getCoffee(@RequestPayload Order order, MessageContext context){ DataHandler handler = new DataHandler( new URLDataSource( Service.class.getResource("coffee.jpg"))); SaajSoapMessage message = saajMessageFactory.createWebServiceMessage(); message.addAttachment("picture", handler); context.setResponse(message); return new Coffee("Hot Joe"); } public void setSaajMessageFactory(SaajMessageFactory saajMessageFactory){ this.saajMessageFactory = saajMessageFactory; } public SaajMessageFactory getSaajMessageFactory(){ return saajMessageFactory; }}从好的方面来说,这是获取的bean依赖项注入
SaajMessageFactory:
<bean id="soapMessageFactory" factory-method="newInstance" /><bean id="saajMessageFactory" > <constructor-arg ref="soapMessageFactory" /></bean><bean id="myService" > <property name="saajMessageFactory" ref="saajMessageFactory" /></bean>



