1

ユーザー名と電子メールに一意の制約があるSpring Security Userクラスがあります。Command クラスでは、「importFrom User」を使用して、このクラスからすべての制約をインポートしました。一意のものを除いて、すべての制約が期待どおりに機能します。

ただし、ユーザーを保存すると、一意の制約が検証され、エラーが表示されます。ただし、他のすべての制約と同様に、保存する前に検証されると便利です。

アップデート

これをコントローラーに追加しました:

user.errors.fieldErrors.each {
    command.errors.rejectValue(it.getField(), it.getCode())
}

汚い回避策のように思えますが、機能します。

4

3 に答える 3

1

良い質問@Chrisです。ドメインクラスとコマンドオブジェクト間で制約を共有するという目標は、検証ロジックの重複を避けることであるため、あなたのソリューションが最適です。

フィールド エラーの重複を回避し、ドメイン オブジェクト内のネストされたフィールド パスを処理するために、次のようなものが必要になる場合があります。

def save(EntityCreateCommand cmd) {
    def entity = new Entity(cmd.properties)
    def someAssociation = new Something(cmd.properties)
    entity.someAssociation = someAssociation

    entity.validate()

    entity.errors.fieldErrors.each {
        def fieldName = it.field.split("\\.").last()
        def flattenedCodes = cmd.errors.getFieldErrors(fieldName).codes.flatten()
        if(cmd.hasProperty(fieldName) && (!flattenedCodes.contains(it.code))) {
            cmd.errors.rejectValue(fieldName, 
                "entityCreateCommand.${fieldName}.${it.code}")
        }
    }

    if(cmd.errors.hasErrors()) {
        error handling stuff...
    } else {
        business stuff...
    }
}
于 2013-08-13T19:05:31.073 に答える
0

以前に一意の制約に問題があったため、コマンド オブジェクトにカスタム バリデータを作成して、それが一意かどうかをテストして確認しました。

コマンド オブジェクト:

class wateverCommand{
    ....
    String username

    static constraints = {
        username validator:{value, command ->
            if(value){
                 if(User.findByUsername(value){
                     return 'wateverCommand.username.unique'
                 }
            }
        }
    }
}

messages.properties 内にカスタム エラー メッセージを追加します。

wateverCommand.username.unique The username is taken, please pick a new username
于 2012-10-18T22:51:46.100 に答える