我有一个 JAXB 对象 (ProductRequest),它表示 Web 服务请求的 XML 文档。假设它看起来像这样:
<ProductRequest>
<getProducts/>
</ProductRequests>
对于响应,JAXB 对象 (ProductResponse) 将表示一个 XML 文档,如下所示:
<ProductResponse>
<productId>1</productId>
<productName>Oranges</productName>
<productId>2</productId>
<productName>Apples</productName>
</ProductResponse>
使用 Spring-WS,我可以使用两种方法向 Web 服务发送请求
使用 JAXB 对象
ProductRequest productRequest = new productRequest();
ProductResponse productResponse = (ProductResponse) webServiceTemplate
.marshalSendAndReceive(productRequest);
使用纯 XML/DOM
DOMResult domresult = new DOMResult();
webServiceTemplate.sendSourceAndReceiveToResult(source, domresult); //source represents the XML document as a DOMSource object
Element responseElement = (Element) domresult.getNode().getFirstChild();
当我尝试这两种方法时,结果是不同的。使用 JAXB 对象的第一种方法的结果是
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProductResponse xmlns="http://mySchema">
<productId>1</productId>
<productName>Oranges</productName>
<productId>2</productId>
<productName>Apples</productName>
</ProductResponse>
使用 XML Dom 对象的第二种方法的结果是(包括命名空间)
<?xml version="1.0" encoding="UTF-8"?>
<ns2:ProductResponse xmlns:ns2="http://mySchema">
<ns2:productId>1</ns2:productId>
<ns2:productName>Oranges</ns2:productName>
<ns2:productId>2</ns2:productId>
<ns2:productName>Apples</ns2:productName>
</ns2:ProductResponse>
用于 Web 服务响应的架构 header 声明为:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:z="http://mySchema"
targetNamespace="http://mySchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
-- Schema elements
</xs:schema>
响应有两处差异
- JAXB 请求响应的第一行包含条目standalone="yes">
- JAXB 版本上的元素没有命名空间前缀
- 带有以架构为前缀的元素的响应不应该使用“z”(如架构中定义)而不是 ns2 吗?
我不明白是什么导致了这种差异,因为它们都调用相同的 Web 服务,该服务根据相同的架构生成响应。有任何想法吗?
XML 内容是相同的,但 XML 格式的差异给我带来了问题,因为我无法使用 String.equals() 来比较两者。
最佳答案
响应是相同的,只是响应没有限定 namespace 。
顺便说一句,您的 XML 设计看起来有点不稳定。这样可能会更好;
<ProductResponse>
<product>
<id>1</id>
<name>Oranges</name>
</product>
<product>
<id>2</id>
<name>Apples</name>
</product>
</ProductResponse>
为什么?因为您不应该依赖元素的顺序。
关于java - 使用 JAXB 或 XML DOM 对象时 Spring Web 服务返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11053893/