Веб-сервис требует, чтобы я установил тип 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"/>
Что я могу сделать, чтобы решить эту проблему?




У меня было значение в моем 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