JAX-WS RI 不强制执行 XSD 限制

Jef*_*rin 5 validation xsd jax-ws restriction

我目前正在使用 JAX-WS 参考实现(版本 2.1.7)开发一些 Web 服务。它们是基于合同的,即 WSDL 和 XSD 文件不是由 wsgen 生成的。

这使我能够自由地使用 XSD 限制来加强对通过 SOAP 消息传递到我的服务的值的验证。以下是此类“受限”XSD 元素的两个示例:

<xsd:element name="maxResults" minOccurs="1">
  <xsd:simpleType>
    <xsd:restriction base="xsd:positiveInteger">
      <xsd:minInclusive value="1"/>
      <xsd:maxInclusive value="1000"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
<xsd:element name="lastName" minOccurs="0">
  <xsd:simpleType>
    <xsd:restriction base="xsd:string">
      <xsd:minLength value="1"/>
      <xsd:maxLength value="25"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

我将@SchemaValidation注释添加到我的服务类中以强制架构验证。但是,JAX-WS 并不按预期强制执行验证规则。行为如下:

  • 正确报告缺少的强制元素(例如,缺少maxResults)。
  • 无效值(例如,整数字段中的字符数据)也会正确报告。
  • 间隔限制违规(例如,maxResults> 1000 或maxResults< 1)会通过验证过程而不被报告,并被注入到我的 JAXB 生成的 Java 结构中。无论类型如何,即使负值也被认为是有效的xsd:positiveInteger
  • lastName也不报告字符串长度约束违规(例如,长度超过 25 个字符)。

换句话说,<xsd:element>标签中出现的限制是正确执行的,但<xsd:restriction>在基于 JAX-WS 的上下文中使用时,JAXB 似乎完全忽略了元素。

我编写了一个测试类来使用裸 JAXB(无 JAX-WS)检查我的 XSD 限制。因此,所有限制都得到正确执行。

这让我感觉 JAX-WS 使用 JAXB 时可能存在错误...当然,除非我做错了什么...

我在这里错过了一些基本的东西吗?!?

预先感谢您的任何帮助,

杰夫

Jef*_*rin 3

我终于发现出了什么问题...

为了让我的 Web 服务在 JUnit 上下文中工作(即通过 发布)Endpoint.publish(),我必须wsdlLocation从注释中删除该属性@WebService。如果不这样做,wsdlLocation = "WEB-INF/wsdl/SearchIndividualsV1_0.wsdl"传递给注释的 URL 值将与传递给方法的@WebServiceURL 值发生冲突。Endpoint.publish()http://127.0.0.1:9000/rpe-ws/SearchIndividuals

阅读 Glen Mazza 的博客 ( http://www.jroller.com/gmazza/entry/soap_xml_schema_validation )的“附加注释”部分后,我放回了wsdlLocation属性,所有限制现在都已正确执行。

换句话说,删除注释wsdlLocation中的@WebService不会阻止服务本身工作,但会阻止<xsd:restrictions>元素中声明的限制得到正确执行。然而,元素中声明的限制<xsd:element>仍然正确执行。

因此,我必须重新解决wsdlLocation兼容性问题,以使我的单元测试正常工作,但这比生产环境中的非工作验证要重要得多......

以防万一...有人知道在非 Web 上下文中运行 Web 服务时出现的 WSDL 位置不兼容性吗?

谢谢,

杰夫