2

十分な情報を提供していない場合は、事前に許してください。これは私が見ている問題であり、修正する必要がありますが、このコードを最初に個人的に書いたわけではありません (書いた人は先に進みました)。

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 ファイルは変更されていません。何がありますか?

これまでの調査に役立つ次のリンクを見つけました。

おそらく、膨大な時間をかけずにこの問題を解決する唯一の現実的な方法は、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 に依存しています。

どんな提案でも大歓迎です!


iFrame の LinkedIn 認証要求ページ?

LinkedIn を使った経験のある人はいますか? 認証リクエスト(このアプリケーションが私の...にアクセスできるようにする)ページをiFrameに入れ、それを私のページにロードしようとしています。

ただし、ロード直後 - ウィンドウ全体に再ロードされます。これが意図的にブロックされているかどうかは誰にもわかりません...子iFrameがそのようなことをすることは不可能だと思いましたか?

これは関連しているようですJSを使用して、子iframeのリダイレクトを停止するか、少なくともリダイレクトについてユーザーにプロンプ​​トを表示するにはどうすればよいですか

4

2 に答える 2

1

Nillable は、自分で実装するものではありません。これは XSD 定義の一部です。

xsi:nil="true"フィールドのインスタンスに値がないことを示すために使用されます。

nillable="true"フィールドのスキーマ定義で値が許可されていないことを示すために使用されます。

それとも私はポイントを逃しましたか?

于 2011-09-28T08:56:31.660 に答える
1

かなりの量のデバッグを行った結果、答えがわかりました。2 つのバージョンの違いがわかりました。

Spring クラスorg.springframework.web.servlet.tags.form.ValueFormatterは、バージョン 2.5.6.SEC02 と 3.0.5.RELEASE で若干の違いがあります。

メソッドの実装はgetDisplayString、2 つのバージョン間で異なります。

2.5.6.SEC02 (私のアプリケーションでは正しく動作しています)

if (propertyEditor != null && !(value instanceof String)) {
    try {
        propertyEditor.setValue(value);
        return getDisplayString(propertyEditor.getAsText(), htmlEscape);
    }
    catch (Throwable ex) {
        // The PropertyEditor might not support this value... pass through.
        return getDisplayString(value, htmlEscape);
    }
}
else {
    return getDisplayString(value, htmlEscape);
}

3.0.5.RELEASE (日付値が設定されていない場合は XML フラグメントを表示します):

if (propertyEditor != null && !(value instanceof String)) {
    try {
        propertyEditor.setValue(value);
        String text = propertyEditor.getAsText();
        if (text != null) {
            return getDisplayString(text, htmlEscape);
        }
    }
    catch (Throwable ex) {
        // The PropertyEditor might not support this value... pass through.
    }
}
return getDisplayString(value, htmlEscape);

propertyEditor.getAsText() から返されるテキストは、日付に値がないため、「値」プロパティが使用されている場合、常に null を返します。問題は実際には私のアプリケーションの一部のコードにあると思います (カスタム XmlBaseTypePropertyEditor は間違いのようです)。Spring の変更に問題はないと思います。

誰かの時間を無駄にしてごめんなさい。とにかくありがとう。

于 2011-11-01T15:17:05.730 に答える