十分な情報を提供していない場合は、事前に許してください。これは私が見ている問題であり、修正する必要がありますが、このコードを最初に個人的に書いたわけではありません (書いた人は先に進みました)。
Apache XMLBeans を使用して、一連の XSD からいくつかの Java クラスを生成しています。次に、Web アプリケーションは Web HTML フォームを生成して、これらのクラスのインスタンスを作成します (または既存のクラスのフィールドを変更します)。これを何らかの文脈に入れるには; XSD の 1 つは人を表します。次に、一般的なフォーム生成コードを使用して、ユーザーが特定の人に関する情報を提供するための HTML フォームを生成できます。生年月日など、人に関連付けられた日付属性がいくつかあります。
最近、プロジェクトの構造と依存関係に大幅な変更を加えましたが、これらの Java クラスとそれらから HTML フォームを生成するコードに直接関係するものは何もありません。<xml-fragment uid="theAttributesId"/>
これらの変更が行われる前は、すべてが機能していましたが、値が設定されていない場合、すべての日付フィールドの値が になります。XSD では、これらの日付属性/要素の minOccurs 属性が 0 に設定されています (したがって、オプションにする必要があります)。それぞれに対して nillable 属性を true に設定すると、おそらく存在しなくなります。
デバッグに時間を費やした結果、nillable が true でない限り、空の日付値は有効な値ではないことがわかりました。XMLBeans クラスXmlObjectBase
では、validate メソッドは null の日付フィールドに対して false を返します。私が理解していないのは、何が変更されたのか、なぜ nillable 属性が必要なのかということです。依存関係は変更されていますが、XMLBean のバージョンを比較すると、すべて同じように見えます。
クラス XmlObjectBase を含む Web アプリの lib ディレクトリに 3 つの jar があります。tika-app-0.7、xbeans-2.2.0、xmlBeans-2.3.0。すべてのバージョンは、大規模な再構築前の lib ディレクトリと同じです。XSD ファイルは変更されていません。何がありますか?
これまでの調査に役立つ次のリンクを見つけました。
- https://issues.apache.org/jira/browse/XMLBEANS-220
- nillable および minOccurs XSD 要素属性
- http://www.dimuthu.org/blog/2008/08/18/xml-schema-nillabletrue-vs-minoccurs0/
- http://www.ibm.com/developerworks/xml/library/ws-tip-null/index.html
おそらく、膨大な時間をかけずにこの問題を解決する唯一の現実的な方法は、nillable 属性を追加することであると私は認めています。ただし、XSD のすべての日付要素に追加することに熱心ではありません。幸いなことに、すべての日付要素が定義されている 3 つの日付ベース タイプがあります。基本型のデフォルトの nillable 属性を true に変更しようとしましたが、成功しませんでした:
元の NonFutureDateBaseType:
<xs:complexType name="nonFutureDateType">
<xs:simpleContent>
<xs:extension base="cr:nonFutureDateBaseType">
<xs:attribute name="uid" type="xs:int" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
(ここcr:nonFutureDateBaseType
で、標準の XSD 日付型の制限付きの単純な型)
試行された nillable デフォルトを true として新規作成:
<xs:complexType name="nonFutureDateType">
<xs:simpleContent>
<xs:extension base="cr:nonFutureDateBaseType">
<xs:attribute name="uid" type="xs:int" />
<xs:attribute name="nillable" type="xs:boolean" default="true" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
上記が機能しない理由について何か提案はありますか? または、他に何を調べる必要がありますか?
長い質問 (および書式設定の欠如 - 何らかの理由で SO 画像/アイコンがありません) についてお詫びし、事前に感謝します。
詳細編集
人物を表す XML をデータベースで調べたところです。私はこのようなものを持っています:
<PERSON>
...
<BIRTH_DATE uid="12"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:nil="true" />
...
</PERSON>
そして、BIRTH_DATE の値は に評価され<xml-fragment uid="theAttributesId"/>
ます。え?私が読んだことから、それは「」と評価されることを意味するはずです。うーん...
別の編集:
私はこの問題にひどくうんざりしているので、最新の Web アプリと以前のコードベースを実行しているアプリとの違いを調査し始めました。デバッグ時に見られる主な違いは次のとおりです。
新しいコードベース: java.beans.PropertyEditorSupport.getValue() を呼び出すと戻ります
<xml-fragment uid="12"/>
古いコードベース: java.beans.PropertyEditorSupport.getValue() を呼び出すと返される
<xml-fragment uid="12" xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
フォームを生成する JSP と値のセッターの間には、多くの Spring クラスがあります。新しいコードベースと古い (動作中の) コードベースの主な違いは、Spring のバージョンです。
新しいコードベースは spring-context-3.0.5.RELEASE に依存していますが、古いコードベースは spring-context-2.5.6.SEC02 に依存しています。
どんな提案でも大歓迎です!