2

我使用我们组织内另一个团队开发的 XSD 以合同优先(自上而下)的方式开发了一个小型 Web 服务。我遇到的问题是,如果请求格式稍有错误,服务仍会运行。我真的需要它来验证针对 XSD 的请求,但我不知道如何强制 Axis 或 Castor 这样做。

当我说“格式稍有错误”时,我的意思是请求包含正确的元素,但排序不正确。在 Castor 解组期间,将拒绝真正格式错误的请求。格式稍有错误的请求将解组,并可能产生不希望的结果。这是一个例子:

一个有效的请求应该包含如下所示的项目列表:

<ItemList>
  <Item>Value1</item>   
  <Item>Value2</item>   
  <Item>Value3</item>   
</ItemList>

这将正确解组,Web 服务将处理所有三个值。

但是,我发现如果像这样呈现相同的一组值:

<ItemList>
  <Item>Value1</item>   
  <Item>Value2</item>   
</ItemList>
<ItemList>
  <Item>Value3</item>   
</ItemList>

然后这也将以与第一个示例相同的方式解组,并且将处理所有三个值。在这种情况下,最终结果是可以接受的,但是根据 XSD,这种结构是不正确的,我更希望它产生故障。

这是取自 XSD 的请求定义:

<xsd:complexType name="SampleRequestType">
  <xsd:sequence>
    <xsd:element name="ItemList" minOccurs="1" maxOccurs="1">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="Item" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  </xsd:sequence>   
</xsd:complexType>

SoapUI 将第二个示例报告为无效,因此我确信 XSD 是正确的。

我已经尝试了一些方法来强制进行 XSD 验证,但到目前为止没有任何效果。有谁知道如何强制 Axis 或 Castor 进行验证?

由于历史原因,我正在使用这两个组件的旧版本 - Axis 1.3 和 Castor 1.1,但如果我能让 XSD 验证正常工作,我愿意承受任何升级的痛苦。

非常感谢

史蒂夫

4

1 回答 1

0

试试这个链接:

http://www.mail-archive.com/axis-user@ws.apache.org/msg21382.html

它与 Axis 1.3 相关,涉及使用自定义过滤器和帮助程序类来进行验证。

至于 Castor,在他们的网站上有一些关于模式验证的示例,不确定它们与您的版本的相关性如何(看起来很旧),但可能是升级的原因:

http://www.castor.org/how-to-enable-xml-validation.html

整个事情太大了,无法在这里发布,但我发布的链接看起来很稳定。

于 2012-05-01T17:17:16.670 回答