如何在Spring-WS中将附件添加到响应有效负载?
问题内容:
我正在构建一个旨在共享内容的Web服务服务器。我想通过包含附件的SOAP响应来提供内容。现在,我正在使用Spring WS处理请求和提供响应。
我的服务类似于以下内容:
@Endpoint
public class Service{
@PayloadRoot(namespace = "http://foo.com/coffee", localPart = "order")
@ResponsePayload
public Coffee getCoffee(@RequestPayload Order order){
return new Coffee("Hot Joe");
}
}
但是,假设我想在响应中附加一杯咖啡的图片,该在哪里以及如何执行?
编辑:顺便说一句,Spring-WS附带的示例显示了如何使用客户端发送附件,但是没有显示服务器如何响应附件(这就是我在这里要问的)。
问题答案:
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)
放在一起:
@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;
}
}
从好的方面来说,这是获取的bean依赖项注入SaajMessageFactory
:
<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>