【发布时间】:2016-11-02 09:16:43
【问题描述】:
我有一个用 Axis2 用 Java 构建的 SOAP Web 服务,请求中的几个元素不能为空。例如我可以验证最小长度,但我也有不应为空的日期和布尔值。如何在 XSD 中验证这一点?
一个空的日期元素通过模式验证并在 Java 层中给我一个空日期。我可以检查它是否不为空,如果不是,我的日期之一是可选的,如果元素为空,我必须返回错误,而不是将其视为丢失。
对于可选元素,Axis2 生成的类提供了一个 'isThisElementSpecified()' 方法,但在元素映射到 Object 的情况下,如果元素为空,则返回 false,因此我无法区分由于为空的 null 和缺少元素。
空的布尔元素也通过了模式验证,我在 Java 层得到了“假”。更糟糕的是,尽管这些元素是可选的,但 isThisElementSpecified() 方法对于映射到原始元素的空元素返回 true,因此我什至不能将它们视为元素不存在(如果只有一个,则必须默认为 true)未指定)。
所有这些元素在 XSD 中都是 nillable="false"。布尔值有一个默认值,但没有效果(我读到“默认”仅适用于属性)。
我找到了很多关于如何接受空日期元素的答案,这表明正常行为是它无法按照我的意愿进行架构验证,但这里没有这样做.
编辑:关于不允许空元素的现有问题表明 minLength=1 限制,但这些数据类型不允许这样做。
我的 XSD 的相关位:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.my.company.com/project"
targetNamespace="http://www.my.company.com/project"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="fooRequest">
<xs:complexType>
<xs:sequence>
<!--snip some stuff-->
<xs:element name="startDate" type="xs:date"
nillable="false" minOccurs="0" />
<!--snip-->
<xs:element name="includeBar" type="xs:boolean"
default="true" nillable="false" minOccurs="0" />
<!--snip-->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
【问题讨论】:
-
@TomRedfern 该问题仅提及字符串元素,建议的答案是将长度限制为至少 1 - 正如我所提到的,我知道字符串的解决方案。日期或布尔值不允许这种类型的限制。
-
哪个验证器接受
<startDate/>对该架构有效?您是否针对它提出了错误报告? -
@C.M.Sperberg-McQueen 经过进一步调查,我了解到 Axis2 不会针对架构进行验证,除非您包含此 Web 服务没有的特定模块。所以……没有。模式仅用于生成 Java 类,其中包括对显式限制的验证,但通常不用于验证元素是否为空。正确的解决方案是使用验证模块,但由于我无法控制的情况,这不是一个选项。
标签: java validation xsd axis2