Я получил этот код:
public class MyHandler implements SOAPHandler<SOAPMessageContext> {
...
@Override
public boolean handleMessage(SOAPMessageContext context) {
Boolean outBoundProperty = (Boolean) context
.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
try {
if (outBoundProperty) {
return processOutputMessage(context);
} else {
return processInputMessage(context);
}
} catch (SOAPException | IOException e) {
messagesLog.error(e, e);
reportLog.error(e,e);
return false;
}
}
...
private boolean processOutputMessage(SOAPMessageContext context) throws SOAPException, IOException {
Logger localLogger;
OutputFormat outputFormat = new OutputFormat();
outputFormat.setExpandEmptyElements(true);
SOAPMessage msg = context.getMessage();
SOAPHeader header = msg.getSOAPHeader();
Element rootElement = (Element) header.getChildNodes().item(0);
Element signatureElement = (Element) rootElement.getChildNodes().item(0);
Document dom4jDocument = signatureElement.getOwnerDocument();
org.dom4j.io.DOMReader reader = new DOMReader();
org.dom4j.Document document = reader.read(dom4jDocument);
if (isRegistry(document)) {
localLogger = reportLog;
} else {
localLogger = messagesLog;
}
org.dom4j.Node node = document.selectSingleNode("/*[local-name()='Envelope']/*[local-name()='Body']/*");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
XMLWriter writer = new XMLWriter(stream, outputFormat);
writer.write(node);
String bodyString = new String(stream.toByteArray());
String sign = signer.sign(bodyString.getBytes()/*, signAlgorithm*/);
signatureElement.setTextContent(sign);
localLogger.info("Request: " + nodeToString(msg.getSOAPPart()));
return true;
}
С java 7 я получил правильно сгенерированный запрос. После обновления до java 11 мне пришлось использовать jaxsws-rt и некоторые другие библиотеки, потому что javax. xml .ws был удален.
Есть разница, после и до:
After: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
Before: <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
After: <S:Header xmlns="*">
Before: <S:Header>
After: <S:Body xmlns="*">
Before: <S:Body>
Пробовал использовать старую библиотеку. Я взял rt.jar из своего старого jdk и использовал его с файлами реализации gradle, но во время выполнения я вижу, что используется jaxws-rt.jar. И я считаю, что решать проблему таким образом - плохое решение. В любом случае, мне интересно, есть ли способ принудительно использовать rt.jar без удаления jaxws-rt.jar, потому что произойдет ClassNotFoundException
Я уверен, что есть способ решить мою проблему с помощью пары строк кода поэтому, пожалуйста, помогите мне
Я тоже добавил эти строки
msg.getSOAPHeader().removeAttribute("xmlns");
msg.getSOAPBody().removeAttribute("xmlns");
И это работает, мой запрос успешно обработан. Но в