DataHandler в запросе SOAP

Веб-сервис требует, чтобы я установил тип DataHandler, который должен быть вложением xml.

DataSource dataSource = new FileDataSource(tempFile.getAbsolutePath()); 
DataHandler dataHandler = new DataHandler(dataSource);
request.setDataHandler(dataHandler);

Проблема в том, что SOAPMessage, сгенерированный из Axis2, имеет значение base64.

<dataHandler>big string64 string representing my content</dataHandler>

где вместо этого он должен быть

<dataHandler><inc:Include href = "cid:attachmentid" xmlns:inc = "http://www.w3.org/2004/08/xop/include"/></dataHandler>

Content-Type: text/xml; charset=us-ascii; name=Sample.xml
Content-Transfer-Encoding: 7bit
Content-ID: <attachmentid>
Content-Disposition: attachment; name = "Sample.xml"; filename = "Sample.xml"

... the xml content....

WSDL

  <xsd:element name = "dataHandler" type = "xsd:base64Binary" maxOccurs = "1" minOccurs = "1" xmime:expectedContentTypes = "application/octet-stream"/>

Что я могу сделать, чтобы решить эту проблему?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 416
1

Ответы 1

У меня было значение в моем xmlobject, которое было DataHandler, это мое решение для помещения обработчика данных в значение как объект с xml внутри него:

XmlObject с корневым элементом:

RootXmlObject xml = new RootXmlObject();

Затем вы настраиваете маршаллер для преобразования в строку:

JAXBContext context = JAXBContext.newInstance(RootXmlObject.class);
Marshaller mar= context.createMarshaller();
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter sw = new StringWriter();
mar.marshal(xml, sw);
String xmlString = sw.toString();

Создайте собственный обработчик данных:

DataHandler.setDataContentHandlerFactory(new YourDatahandler());
private class YourDatahandler implements DataContentHandlerFactory {

    @Override
    public DataContentHandler createDataContentHandler(String mimeType) {

        return new XmlDataContentHandler();
    }
}

public static class XmlDataContentHandler implements DataContentHandler {


    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[] {DataFlavor.stringFlavor};
    }
    @Override
    public Object getTransferData(DataFlavor dataFlavor, DataSource dataSource) throws UnsupportedFlavorException, IOException {
        return new String("Whateverstring");
    }

    @Override
    public Object getContent(DataSource dataSource) throws IOException {
        return new String("Whateverstring");

Какой метод writeTo работает следующим образом:

    @Override
    public void writeTo(Object o, String s, OutputStream outputStream) throws IOException {
        byte[] stringByte = (byte[]) ((String) o).getBytes("UTF-8");
        outputStream.write(stringByte);
    }

Наконец, вставьте xmlString в обработчик данных:

DataHandler testHandler = new DataHandler(xmlString, "text/xml");

Вот ссылка на мой проект: https://github.com/habelo/domibusdemo

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