【问题标题】:How do I add an attachment to a response payload in Spring-WS?如何在 Spring-WS 中向响应有效负载添加附件?
【发布时间】:2011-09-19 23:56:34
【问题描述】:

我正在构建一个旨在共享内容的 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 附带的示例显示了如何使用客户端发送附件,而不是服务器应如何响应一个附件(这是我在这里询问的内容)。

【问题讨论】:

    标签: java spring soap spring-ws


    【解决方案1】:

    Spring-WS 中的文档在这个主题上特别简单,实际上添加 SOAP 附件非常容易。我会做一些假设:

    1. 您的 WSDL 在输出消息中正确指定了mime:multipartRelated
    2. 我们将使用 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>
    

    【讨论】:

    • 是否可以将响应作为 JAXB 对象返回?
    • 我似乎对上述方法有问题。看到这个链接stackoverflow.com/questions/11430527/…
    • 在上面的例子中,你为什么要返回一个 Cofee 对象并在上下文中设置响应。什么会被退回?上下文中响应的咖啡对象?
    • @ziggy:Coffee 对象将成为消息,在上下文中设置响应会添加附件。
    • 比我想象的要容易,找到一个好的简单教程仍然非常困难...... +1。根据您的 Spring 版本,请注意您也可以简单地 @AutowiresaajMessageFactory
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多