我正在创建一个在 Java 11 Spring Boot 服务器中运行并向 Java 8 服务器发出请求的 SOAP 客户端。我在 Gradle 6.9 版本中使用 cxf-rt-frontend-jaxws:3.4.3 和 cxf-rt-transports:3.4.3 以及 com.github.bjornvester.wsdl2java Gradle 插件版本 1.1。
我的客户端可以毫无问题地调用简单的回显测试 SOAP 操作。该服务传递包含单个字符串的请求对象并获取包含该字符串的响应对象。所以我知道基本连接正在工作并且另一端正在响应。
当我调用没有输入并在响应中返回对象列表的操作时,就会出现问题。我收到此错误:
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"ProposalInfo"). Expected elements are <{http://V2.pub.proposal.server.ws.cayuse.com/}ProposalInfo>
我被告知其他系统调用这些操作没有问题。
我已经单步执行了 cxf 和 JAXB 代码,并注意到 IntelliJ 显示了与 BranchingReaderSource 关联的文本。不确定这是否是一个真正的错误,或者只是调试器尝试在此类(没有此类方法)上调用 toString() 的副作用。
Method threw 'java.lang.NullPointerException' exception. Cannot evaluate com.ctc.wstx.io.BranchingReaderSource.toString()
我还注意到,一个名为 ValidationEventLocatorImpl 的类在该行上收到 NullPointerException,因为“toURL”为 null。我认为这是因为 toURL 来自响应中的空前缀。
this.url = toURL(loc.getSystemId());
我尝试过使用包装风格“false”,但这并没有改变任何东西。
我还尝试使用 TransformInInterceptor 将没有前缀的元素映射到所需的前缀,但这不起作用。似乎在拦截器运行之前抛出了解组错误。
这里是WSDL https://drive.google.com/file/d/1mHe7Ju3AuobxRAfwwhb4Wdioe6kQky60/view?usp=sharing用于此服务;我调用的操作是 getUnpairedProposals。我还附上了一份副本response https://drive.google.com/file/d/1Fo25olab3n4y6LtQgUClfDMfh-bgcOfj/view?usp=sharing对于此操作——未正确解组的操作。我对此响应的解读是,在 ns2:getUnPairedProposalsResponse 标记上定义的命名空间应该应用于子元素,例如 .
附加信息:
我多次尝试使用 TransformInterceptor 来映射元素:
-
添加了“getUnPairedProposalsResponse -> {http://V2.pub.proposal.server.ws.cayuse.com/}getUnPairedProposalsResponse”的映射条目。这什么也没做。
-
在 Phase.PRE_STREAM 处插入 TransformInterceptor。也没有效果。
-
将映射从 #1 更改为相同的映射,但添加了前缀 {},如 {}getUnPairedProposalsResponse -> {http://V2.pub.proposal.server.ws.cayuse.com/}getUnPairedProposalsResponse。这让我在 ConvertToQnamesMap 方法中 TransformUtils 第 128 行的 cxf 中出现了空指针异常。