条件付きの非 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 カスタム フィールド バリデータとカスタム エラー メッセージに関連するいくつかの 質問を見てきましたが、私の特定の状況に対処するものは何もないようです。