0

条件付きの非 null 制約を適用するために、フィールドにカスタム バリデータを追加したいと考えています。この要件は複数のオブジェクト間で共有されるため、既存のグローバル (つまり、オブジェクト固有またはフィールド固有ではない) メッセージ キーを再利用したいと考えています。default.null.message以下の例では、のようなものではなく、使用したいと思いobjectA.fieldC.null.messageます。

Grails バリデーターのドキュメントには、message.properties からキーを表す文字列値を返すことで、エラー ケースを知らせることができると書かれているようです。ドキュメントは次のことを示しています(強調は私のものです):

クロージャは以下を返すことができます:

  • 値が有効であることを示す null または true (または戻り値なし)
  • 無効な値を示し、デフォルトのメッセージ コードを使用する場合は false
  • 「classname.propertyName」に追加するエラー コードを示す文字列。エラー メッセージを解決するために使用される文字列。フィールド固有のメッセージを解決できない場合、エラー コード自体が解決され、グローバル エラー メッセージが可能になります。
  • 上記のような文字列とそれに続く任意の数の引数を含むリスト。これらは grails-app/i18n/message.properties ファイルでフォーマットされたメッセージ引数として使用されます。引数のマッピングは次のとおりです。パラメータ 0 ~ 2 は、0: プロパティ名、1: クラス名、2: プロパティ値に自動的にマッピングされます。追加のパラメーターは、パラメーター 3 からマップされます。

また、1.0 でクローズされたGrails のバグも発見しました。

これが私がやっていることの例です。ご覧のとおり、私は 1 つのアプローチで動作しましたが、最初の 2 つのオプションが一見クリーンに見えて機能しないことに本当に悩まされています。

class ObjectA {
    ObjectB fieldB
    ObjectC fieldC
    static constraints = {
        fieldC(nullable: true, validator: { value, object, errors ->
            if (object.fieldB != ObjectB.SOMETHING && !value) {
                // Doesn't work
                //return "default.null.message"
                
                // Doesn't work
                //return ["default.null.message"]

                // This works
                errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field \"{0}\" cannot be null")
            }
        })
    }
}

my のエントリは次のmessage.propertiesとおりです。

default.null.message=The field "{0}" cannot be null

ここで、Grails カスタム フィールド バリデータとカスタム エラー メッセージに関連するいくつかの 質問を見てきましたが、私の特定の状況に対処するものは何もないようです。

4

1 に答える 1

0

検証クロージャの 3 つのパラメーター (値、オブジェクト、エラー) バージョンを使用する場合、基になるコードは、すべてのエラーがエラー オブジェクトに追加されることを前提としています。メッセージキーを表す文字列または文字列のリストを返すため。

Command Objectsを使用する場合も動作は同じです。

以下は、2 パラメーターの検証クロージャーの実際の例です。

class ObjectA {
    ObjectB fieldB
    ObjectC fieldC
    static constraints = {
        fieldC(nullable: true, validator: { value, object->
            if (object.fieldB != ObjectB.SOMETHING && !value) {
                return "default.null.message"
                // You can also use the list style return (especially if you need to pass additional parameters used by the message)
                //return ["default.null.message"]
            }
        })
    }
}

そして、これは 3 つのパラメーターの検証クロージャーの実際の例です。

class ObjectA {
    ObjectB fieldB
    ObjectC fieldC
    static constraints = {
        fieldC(nullable: true, validator: { value, object, errors ->
            if (object.fieldB != ObjectB.SOMETHING && !value) {
                // When "errors" is passed into the closure, you must use it to signal error cases
                errors.rejectValue("defaultBrand", "default.null.message", ["defaultBrand"] as Object[], "The field \"{0}\" cannot be null")
            }
        })
    }
}
于 2014-04-18T18:36:10.890 に答える