Spring ws - обработчик данных со Swaref по-прежнему равен нулю - PullRequest
0 голосов
/ 22 января 2019

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

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

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

Java-версия: 8_0_191

Spring boot version: 2.1

1 Ответ

0 голосов
/ 17 мая 2019

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

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

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

Для людей, которые сталкиваются с той же проблемой при сортировке - это немного сложнее.Jaxb2 AttachmentMarshaller неправильно реализован в соответствии с WS-I Profile Attachment Profile 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;
        }
    }
}

...