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 以便我们可以将 this 特定消息设置为我们响应的消息,我们通过编辑 getCoffee 的定义来做到这一点:
public Coffee getCoffee(@RequestPayload Order order, MessageContext context)
把它们放在一起:
@Endpoint
public 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;
}
}
为了更好地衡量,这里是获取 SaajMessageFactory 的 bean 依赖注入:
<bean id="soapMessageFactory" class="javax.xml.soap.MessageFactory" factory-method="newInstance" />
<bean id="saajMessageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
<constructor-arg ref="soapMessageFactory" />
</bean>
<bean id="myService" class="Service">
<property name="saajMessageFactory" ref="saajMessageFactory" />
</bean>