我目前正在使用JAX-WS参考实现(版本2.1.7)开发一些Web服务。它们是基于合同的,也就是说,WSDL和XSD文件不是由wsgen生成的。JAX-WS RI不执行XSD限制
这使我可以自由使用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
类型,甚至负值也被认为是有效的! - 不报告字符串长度约束违规(例如,长度超过25个字符的
lastName
)。
在出现在<xsd:element>
标签换句话说,限制正确实施,但<xsd:restriction>
元素似乎在基于JAX-WS的上下文中使用时,可以完全被忽略JAXB。
我写了一个测试类来检查我的XSD限制使用裸JAXB(没有JAX-WS)。结果,所有限制都被正确执行。
这给我的感觉,有可能是在JAXB通过JAX-WS的使用......一个bug,除非有什么我做的,当然不正确,...
我失去了一些基本的东西这里?!?
在此先感谢您的帮助,
杰夫
有多种@SchemaValidation注解。一个为我工作的是com.sun.xml.ws.developer.SchemaValidation。我错误地使用com.sun.xml.internal.ws.developer.SchemaValidation,并没有工作。 –