我们有两个有一定用途的应用程序 一个应用程序是基于 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 更改已完成。
谢谢@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";