Мне нужно обновить содержимое AttachmentPart внутри SOAPMessage, как показано на следующем рисунке. Мне нужно держать заголовки одинаковыми.
Можно ли это сделать без создания нового сообщения SOAP? Я использую API SAAJ.Обновление вложения Содержимое упаковки без создания нового сообщения
0
A
ответ
1
Вы можете использовать SOAPMessage.getAttachments() вызова, который возвращает итератор всех частей крепления, чтобы вытащить вложения в новый объект, внести необходимые изменения, а затем вызвать SOAPMessage.removeAllAttachments (), чтобы очистить объекты от исходного сообщения и вызвать функцию addAttachmentPart (AttachmentPart) для повторного добавления измененных объектов?
SOAPMessage message = getSoapMessageFromString(foo);
List<AttachmentPart> collectionOfAttachments = new ArrayList<AttachmentPart>();
for (Iterator attachmentIterator = message.getAttachments(); attachmentIterator.hasNext()) {
AttachmentPart attachment = (AttachmentPart) attachmentIterator.next();
//**DO WORK HERE ON attachment**
collectionOfAttachments.add(attachment);
}
message.removeAllAttachments();
for (AttachmentPart newAttachment : collectionOfAttachments) {
message.addAttachmentPart(newAttachment);
}
// This method takes an XML string as input and uses it to create a new
// SOAPMessage object
// and then returns that object for further use.
private static SOAPMessage getSoapMessageFromString(String xml)
throws SOAPException, IOException {
MessageFactory factory = MessageFactory.newInstance();
// Create a new message object with default MIME headers and the data
// from the XML string we passed in
SOAPMessage message = factory
.createMessage(
new MimeHeaders(),
new ByteArrayInputStream(xml.getBytes(Charset
.forName("UTF-8"))));
return message;
}
Какие изменения вы планируете внести в свои приложения? Было бы проще просто сохранить тело в объекте DOM и создать новое SOAPMessage alltogether?
Спасибо, это решение работает. –
Быстрый вопрос, как мне создать новое SOAP-сообщение из SOAPPart предыдущего сообщения? Сохранение всех заголовков, метаинформация идентична? –
Хммм, если вам нужно сохранить идентичный контент заголовка без восстановления значений, мне нужно будет кое-что сделать в этом. С помощью метода, описанного выше, вы фактически повторно используете исходный объект сообщения со всеми заголовками, которые вы уже добавили к нему при построении - вы только зачищаете и читаете атрибуты 'attachmentPart'. – roflplanes