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

vyswwuz2  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(75)

我们有两个应用程序,其中一个应用程序是基于Eclipse GUI的桌面UI应用程序-使用Java8和Eclipse Ganymede第二个应用程序,最近从Java8迁移到Java 17和Springboot2.7到Springboot3.2
第二个应用程序服务于多个目的,它与数据库连接,并通过SOAP API获得数据库,现在桌面应用程序从SpringBoot应用程序调用SOAP API,并将数据呈现到桌面应用程序中。
一切正常,我们能够获得数据,但迁移到最新版本的Java 17和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-core3.1.1更新到4.0.8。未做任何XML更改。

wvmv3b1j

wvmv3b1j1#

感谢@ jdjs。不知何故,我设法解决了这个问题。正如我的问题中所述,我们最近完成了从Java 8到Java 17的迁移,并将Sping 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类在Java 17中不可用,所以我修改了代码如下

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


javax.*jakarta.*的迁移对项目影响很大。

相关问题