如何在Spring-WS中为响应有效负载添加附件?

时间:2011-06-22 00:59:59

标签: java spring soap 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附带的示例显示了如何使用客户端发送附件,而不是服务器应该如何响应(这是我在这里要问的)。 / p>

1 个答案:

答案 0 :(得分:13)

Spring-WS中的文档对此主题特别轻松,实际上很容易添加SOAP附件。我会做一些假设:

  1. 您的WSDL正确指定了输出消息上的mime:multipartRelated
  2. 我们将使用Saaj SOAP消息工厂
  3. 附件驻留在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以便我们可以将特定消息设置为我们响应的消息,我们通过编辑{{{}的定义来实现这一点。 1}}:

    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
相关问题