我有一个用Axis2用Java构建的SOAP Web服务,请求中的几个元素不能为空。对于例如字符串我可以验证最小长度,但我也有不应该为空的日期和布尔值。如何在XSD中验证?
空日期元素传递模式验证,并在Java层中为我提供null日期。我可以检查它是否为null,如果没有,我的其中一个日期是可选的,如果元素为空则我必须返回错误,而不是将其视为缺失。
对于可选元素,Axis2生成的类提供了'isThisElementSpecified()'方法,但是当元素映射到Object时,如果元素为空则返回false,因此我无法区分由于空和缺少元素。
空布尔元素也传递模式验证,我在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>
答案 0 :(得分:1)
排序!事实证明,虽然minLength仅适用于字符串,但&#39;模式&#39;限制可用于任何基类型。 <xs:pattern value=".+" />
将元素限制为非空。