当前位置: 首页 > 面试题库 >

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

张卓
2023-03-14
问题内容

我正在构建一个旨在共享内容的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附件实际上非常容易。我将做一些假设:

  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以便我们可以将 这一
特定消息设置为响应的消息,我们可以通过编辑以下内容的定义来做到这一点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>


 类似资料:
  • 我非常确定“Expires”是有效的HTTP响应头类型。但是当我尝试在代码中设置它时:(这是在ActionFilter.OnActionExecuted方法中) 我最后有一个例外: InvalidOperationException:错误使用的标头名称。确保请求头与HttpRequestMessage一起使用,响应头与HttpResponseMessage一起使用,内容头与HttpContent对

  • 为此,我实现了一个endpoint,它只是将来自本地文件系统的映像附加到响应。 Saaj属性的深度注入如下所示: 但是,问题是我需要访问MessageContext才能添加附件。可能是我的配置哪里错了?

  • 问题内容: 我真的很难让Spring- WS返回带有附件的响应。我设法获得了MTOM版本,但是这在客户端上有一些先决条件,因为我认为客户端也必须启用MTOM(如果不正确,请更正我)。 我现在想要做的是使用SAAJ和Spring-WS的附件实现实现标准的SOAP。 为此,我实现了一个端点,该端点仅将来自本地文件系统的图像附加到响应。 Saaj属性注入了视点,如下所示: 当我尝试致电上述服务时,出现以

  • 我通过使用承载令牌实现了对SpringBoot API的授权,当登录成功时,该令牌被添加到响应的“授权”头中,然后需要通过React项目的登录获取方法读取该令牌,并添加到后续请求的“授权”头中。 不幸的是,虽然我被告知这是不可能使用Fetch,所以我现在试图重构我的登录功能,以便它返回响应正文中的令牌,而不是标题。 我不知道如何做到这一点,目前没有返回JSON正文对象,只有标头,我将不得不更改我的

  • 我现在正在尝试使用FastAPI构建一个API。我想让一个路由(接受查询)也在响应中返回它们,以便用户可以仔细检查他输入的查询(也可以查看总共有多少页等)。 我正在使用response_model响应方式,并且一生都无法弄清楚如何将其他参数插入响应中。 我已经尝试将响应模型中的所有字段设置为可选,因此它在检查时不再抛出错误,但它仍然只是(如果它响应)在没有添加信息的情况下响应。在下面,您可以看到我

  • 我已经在OpenShift上创建了Spring快速启动应用程序,它运行良好,显示了一个用户注册的网页,除了重新启动后它不记得新成员。我在想,这是因为我没有真正的数据库。所以我添加了一个PostgreSQL-9.2墨盒。所以我的问题是如何将postgresql准确地配置到OpenSift Spring应用程序中,以便这个web服务器能够存储重启后持续存在的数据。