В сообщении soap появились дополнительные атрибуты, проблема с переносом java 7 -> java 11 - PullRequest
0 голосов
/ 07 мая 2020

Я получил этот код:

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");

И это работает, мой запрос успешно обработан. Но в

...