Spring ws - обработчик данных с Swaref по-прежнему равен нулю

Я использовал веб-сервисы Spring Boot Starter для разработки SOAP со службой вложений.

По неизвестной причине вложения не демаршалируются. Jaxb Unmarshaller используется, но свойство AttachmentUnmarshaller внутри имеет значение «null»… так что, вероятно, причина, по которой демаршаллинг DataHandler не выполняется ??

Как и в среде JEE, attachmentUnmarshaller обрабатывается jaxws. Как настроить его в автономном процессе, таком как весенняя загрузка на tomcat?

Версия Java: 8_0_191

Весенняя загрузочная версия: 2.1

1
0
822
1

Ответы 1

Я столкнулся с аналогичной проблемой, но с сортировкой.

Jaxb2Marshaller имеет собственные реализации AttachmentMarshaller и AttachmentUnarshaller. Но чтобы они работали, для свойства mtomEnabled должно быть установлено значение true. Если это не так, будут использоваться значения по умолчанию, которые не создаются.

Попробуйте установить setMtomEnabled(true) на Jaxb2Marshaller. Это, вероятно, решит вашу проблему.

Для людей, которые сталкиваются с той же проблемой с сортировкой - это немного сложнее. Jaxb2 AttachmentMarshaller неправильно реализован в соответствии с профилем вложения WS-I 1.0 — http://www.ws-i.org/Profiles/AttachmentsProfile-1.0.html#Example_Attachment_Description_Using_swaRef

Тогда вам придется переопределить маршалинговое поведение Jaxb2Marshaller.

Уведомление: это решение предполагает, что MTOM всегда отключен.

@Configuration
class SOAPConfiguration {
    @Bean
    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller() {
            @Override
            public void marshal(Object graph, Result result, @Nullable MimeContainer mimeContainer) throws XmlMappingException {
                try {
                    javax.xml.bind.Marshaller marshaller = createMarshaller();
                    if (mimeContainer != null) {
                        marshaller.setAttachmentMarshaller(
                                new SwaRefAttachmentMarshaller(mimeContainer)
                        );
                        marshaller.marshal(graph, result);
                    } else {
                        super.marshal(graph, result, null);
                    }
                } catch (JAXBException ex) {
                    throw convertJaxbException(ex);
                }
            }
        };
        marshaller.setPackagesToScan("my.package");

        marshaller.setMtomEnabled(false);

        return marshaller;
    }

    private class SwaRefAttachmentMarshaller extends AttachmentMarshaller {

        private final MimeContainer mimeContainer;

        private SwaRefAttachmentMarshaller(MimeContainer mimeContainer) {
            this.mimeContainer = mimeContainer;
        }

        @Override
        public String addMtomAttachment(DataHandler data, String elementNamespace, String elementLocalName) {
            return null;
        }

        @Override
        public String addMtomAttachment(byte[] data, int offset, int length, String mimeType, String elementNamespace, String elementLocalName) {
            return null;
        }

        @Override
        public String addSwaRefAttachment(DataHandler data) {
            String attachmentId = UUID.randomUUID().toString();
            mimeContainer.addAttachment("<" + attachmentId + ">", data);

            return "cid:" + attachmentId;
        }
    }
}

Другие вопросы по теме