org.w3c.dom.DOMException:NAMESPACE_ERR:从 Java8 迁移到 Java17

问题描述 投票:0回答:1

我们有两个有一定用途的应用程序 一个应用程序是基于 Eclipse GUI 的桌面 UI 应用程序 - 使用 Java8 和 Eclipse Ganymede 第二个应用程序最近从 Java8 迁移到 Java17,从 Springboot2.7 迁移到 Springboot3.2

第二个应用程序有多种用途,它与数据库连接并通过 SOAP API 获取数据库,现在桌面应用程序从 SpringBoot 应用程序调用 SOAP API 并将数据渲染到桌面应用程序中。

一切工作正常,我们能够获取数据,但是在迁移到最新版本的 Java17 和 Springboot 后,SOAP API 失败,我遇到了异常

org.w3c.dom.DOMException:NAMESPACE_ERR:尝试创建 或以不正确的方式更改对象 命名空间。

代码片段

    @PayloadRoot(namespace = Constants.Namespace.Internal, localPart = "loginRequest")
    @ResponsePayload
    public LoginResponse login(@RequestPayload LoginRequest request)
            throws PasswordExpiredFaultException, LicenseFaultException, LoginFaultException {
        try {
            return loginProcessor.process(request);
        } catch (CatalogAPIException catAPIExp) {
            if (catAPIExp.getMessage().equals(localeService.getMessage("security.password.expired"))) {
                throw new PasswordExpiredFaultException(localeService.getMessage("security.password.expired"));
            }else if (catAPIExp.getMessage().equals(localeService.getMessage("security.invalid.username.password"))) {
                throw new LoginFaultException(localeService.getMessage("op.security.invalid.username.password"));
            } else if (catAPIExp.getMessage().equals(localeService.getMessage("security.account.locked"))) {
                throw new LoginFaultException(localeService.getMessage("op.security.account.locked"));
            } else {
                throw new LoginFaultException(catAPIExp.getMessage());
            }

        }

}

之前使用的

spring-ws-core
3.1.1 更新为 4.0.8 。没有任何 XML 更改已完成。

java xml spring-boot dom soap
1个回答
0
投票

谢谢@jdweng。我设法解决了这个问题。 正如我的问题中所述,我们最近完成了从 Java 8 到 Java 17 的迁移,并将 Spring Boot 版本从 2.7 升级到 3.2。此迁移需要进行大量代码更改,包括对 SOAP 响应处理程序的大量修改。 以前我们使用这样的代码

SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext.getResponse();
SOAPHeader soapHeader = saajSoapMessage.getSaajMessage().getSOAPPart().getEnvelope().getHeader();
SOAPElement element1 = soapHeader.addHeaderElement(new QName(Constants.WS_ADDRESSING, "Action", Constants.WSA));

但是现在 QName 类在 Java17 中不可用,所以我修改了这样的代码

SOAPHeader soapHeader = saajSoapMessage.getSaajMessage().getSOAPPart().getEnvelope().getHeader();
SOAPEnvelope soapEnvelope = saajSoapMessage.getSaajMessage().getSOAPPart().getEnvelope();
Name headerElementName = soapEnvelope.createName(Constants.WS_ADDRESSING, "Action", Constants.WSA);
SOAPElement element1 = soapHeader.addHeaderElement(headerElementName);

现在上面的代码由于这一行而产生了问题

Name headerElementName = soapEnvelope.createName(Constants.WS_ADDRESSING, "Action", Constants.WSA);

如果我们检查这个方法的官方定义,它是这样的

Name jakarta.xml.soap.SOAPEnvelope.createName(String localName, String prefix, String uri) 

我在这里传递了错误的参数,所以我必须像这样使用这个方法

Name headerElementName = soapEnvelope.createName("Action", Constants.WSA,Constants.WS_ADDRESSING);

这解决了问题。

仅供参考...

String WSA = "wsa";
String WS_ADDRESSING = "http://www.w3.org/2005/08/addressing";
© www.soinside.com 2019 - 2024. All rights reserved.