Документация в Spring-WS особенно легка в этом вопросе, и на самом деле довольно просто добавить вложение SOAP.Я сделаю несколько предположений:
- Ваш WSDL правильно указывает
mime:multipartRelated
в выходном сообщении - Мы собираемся использовать фабрику сообщений 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);
Хорошо, содержимое: проверка, сообщение: проверка, хм, все еще нужно получитьответ, чтобы выйти.Сложность заключается в том, что нам нужно ввести 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>