我目前正在使用 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>
我将@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 时可能存在错误......当然,除非我做错了什么......
我在这里错过了一些基本的东西吗?!?
提前感谢您的帮助,
杰夫