Маршалинг запросов Spring SOAP ~ Как принудительно встроить длинные данные (JAXB2 и MTOM)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Маршалинг запросов Spring SOAP ~ Как принудительно встроить длинные данные (JAXB2 и MTOM)

Сообщение Anonymous »

У меня следующая проблема: мне нужно связаться со старой службой SOAP, и она требует от меня отправить объект запроса, в котором большой объем данных находится непосредственно в теле сообщения SOAP, например:

Код: Выделить всё






VeryLongDataBlobInHere

pdf





Проблема в том, что Spring автоматически превращает это в такое вложение, если включен MTOM: Напротив, если MTOM отключен, большой двоичный объект пуст, как показано ниже: Я пробовал различные подходы к решению этой проблемы, в том числе возился с типами данных и пытался настроить свойства маршаллера, чтобы увеличить порог MTOM, но ничего из того, что я пробовал, не помогло. Вот моя конфигурация маршаллера:

Код: Выделить всё

@Configuration
public class Jaxb2MarshallerConfig {

@Bean
public Jaxb2Marshaller myMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.company.project.xsd.some_portal.v4_0");
marshaller.setMtomEnabled(true);
return marshaller;
}
}
И вот где создаются и назначаются двоичные данные:

Код: Выделить всё

    private BinaryData buildBinaryData(byte[] documentData) {
BinaryData binaryData = new BinaryData();
byte[] encodedData = Base64.getEncoder().encode(documentData);
DataHandler dataHandler = new DataHandler(encodedData, "application/pdf");
binaryData.setBlob(dataHandler);
binaryData.setExtension("pdf");
return binaryData;
}
BinaryData — это сгенерированный класс, построенный на основе WSDL, поэтому я не могу ничего там изменить. А вот как это выглядит:

Код: Выделить всё

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BinaryData", propOrder = {
"blob",
"extension"
})
public class BinaryData {

@XmlElement(required = true)
@XmlMimeType("application/octet-stream")
protected DataHandler blob;
@XmlElement(required = true)
protected String extension;

[...]
}
Наконец, вот как я отправил всю эту ерунду:

Код: Выделить всё

@Component
@Log4j2
public class MySoapClient extends WebServiceGatewaySupport {
private final WebServiceTemplate template;

public MySoapClient (
MyServiceProperties properties,
Jaxb2Marshaller marshaller
) {
setMarshaller(marshaller);
setUnmarshaller(marshaller);
setDefaultUri(properties.getTargetUrl());
template = getWebServiceTemplate();
}

@Override
public void sendDocuments(MyRequest request) {
try {
template.marshalSendAndReceive(request);
} catch (Exception e) {
log.error(e, e.getCause());
throw new RuntimeException(e);
}
}
}
Я предполагаю, что мне каким-то образом нужно увеличить порог MTOM, но я понятия не имею, как это сделать. Я пробовал возиться с marshaller.setMarshallerProperties(), но ничего не помогло.
Есть ли у кого-нибудь идеи, как заставить маршаллер записать встроенный объект blob? Или проблема где-то в другом?

Подробнее здесь: https://stackoverflow.com/questions/791 ... a-jaxb2-mt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»