gpt4 book ai didi

java - 如何在 Spring-WS 中向响应负载添加附件?

转载 作者:搜寻专家 更新时间:2023-10-31 08:21:02 25 4
gpt4 key购买 nike

我正在构建一个旨在共享内容的 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);

好的,content: check, message: check,嗯,还是要得到回复才能出去。这里棘手的部分是我们需要引入 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 的 beans 依赖注入(inject):

<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>

关于java - 如何在 Spring-WS 中向响应负载添加附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6433762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com