私は、Axis2を使用してJavaで構築されたSOAP Webサービスを持っています。要求のいくつかの要素は空であってはいけません。例えば、私は最小の長さを検証することができますが、私も空であってはならない日付とブール値を持っています。これをXSDでどのように検証できますか?XSDの空の要素を許可しない
空のdate要素がスキーマの検証に合格し、Javaの層にnullのDateを与えます。私はそれがヌルではないことを確認することができました。そうでない場合、私の日付の1つはオプションであり、欠落しているかのように扱うのではなく、要素が空の場合はエラーを返さなければなりません。
オプションの要素の場合、Axis2生成クラスは 'isThisElementSpecified()'メソッドを提供しますが、要素がオブジェクトにマップされている場合、要素が空の場合はfalseを返します。したがって空のためにnullを区別できません欠けている要素。
空のブール要素もスキーマの検証に合格し、Javaレイヤーでは「偽」と表示されます。さらに悪いことに、これらの要素はオプションですが、isThisElementSpecified()メソッドは、プリミティブにマップする空の要素に対して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に制限することです - 私が言及したように、私はその解決策を文字列に認識しています。そのタイプの制限は、日付またはブール値には許可されません。 – CarrieVS
どのバリデーターがこのスキーマに対して有効なものとして ' 'を受け入れますか?あなたはそれに対してバグレポートを提起しましたか? –
@ C.M.Sperberg-McQueenさらに調査したところ、このWebサービスにはない特定のモジュールを含めない限り、Axis2はスキーマに対して検証されないことを学びました。だから... スキーマはJavaクラスの生成にのみ使用され、明示的な制限の検証が含まれますが、要素が空であるかどうかは一般的ではありません。 正しい解決策は、検証モジュールを使用することでしたが、私のコントロール外の状況ではオプションではないためでした。 – CarrieVS