2011-06-22 28 views
5

我正在构建一个旨在共享内容的Web服务服务器。我想通过包含附件的SOAP响应来提供内容。现在,我使用Spring WS来处理请求和服务响应。如何在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附带的例子展示了如何使用客户端发送附件,但不知道服务器应该如何响应(这是我在这里问的)。

回答

13

Spring-WS中的文档特别关注这个主题,它实际上很容易添加SOAP附件。我会做出一些假设:

  1. 你的WSDL正确指定mime:multipartRelated
  2. 我们将使用SAAJ SOAP消息厂

附件驻留在MimeContainer上输出消息SOAP消息。为了获得这个容器,我们需要手动构建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); 

好吧,内容:检查,消息:检查,HM,仍然需要得到响应走出去。这里最棘手的部分是,我们需要在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; 
    } 

} 

良好的措施,这里的豆依赖注入获得一个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> 
+0

是否有可能将响应作为JAXB对象返回? – ziggy

+0

@ziggy:这就是这已经在做什么,不是? –

+0

我似乎遇到了上述方法的问题。看到这个链接http://stackoverflow.com/questions/11430527/spring-ws-web-service-adding-an-attachment-to-the-response-using-saaj-no-adap – ziggy

相关问题