java - 使用 JAXB 或 XML DOM 对象时 Spring Web 服务返回不同的结果

标签 java xml spring xsd jaxb

我有一个 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/

相关文章:

javascript - 从 XML 中提取数据不起作用

java - Spring在xml中声明组件

java - Spring Cloud Sidecar 配置问题

java - 将 spring boot 与 vaadin 结合使用时,js 文件出现 404

java - 在使用 spring data jpa 和 rest 时防止 hibernate 在启动时生成所有查询计划

java 。 BufferedInputStream 处理图像

java - 如何将ResultSet对象转换为ArrayList

java - Log4j 2 记录输出消息以及文​​件编号的链接

python - 如何让Python bs4在XML上正常工作?

spring - Elasticsearch 返回空的 json 对象