9

エンティティの特定のフィールドが特定の条件で一意であるかどうかをチェックするカスタムBeanバリデーターがあります。検証が失敗した場合、メッセージには既存のエンティティのフィールド(IDなど)が含まれている必要があります。したがって、たとえば、メッセージは次のようになります。

"Product 42 already has such a value defined, choose a unique value."

これはBeanValidationを使用して可能ですか?

AFAICSの場合、メッセージ形式には次のようなパラメータが含まれる場合があります。

"Length must be between {min} and {max}."

ただし、これは検証アノテーションの「静的」属性のみを参照できます。この場合は次のようになります。

@Size(min=1, max=16)
private String name;

私の場合、値はisValidカスタムバリデーター内でのみ認識されます。

4

2 に答える 2

3

あなたは正しいです!そしてあなたが望むもののために!、isValid()メソッド内に制約違反メッセージを作成することができます。このため、制約アノテーションは、それが適用された特定のクラスに固有である必要があり、クラスレベルの検証制約である必要があります。検証の失敗時にfalseを返す前に、isValid内で、クラスインスタンスの値で構成されるメッセージを作成できます。例えば:

@check class Test{ int id; @validations...on fields}.

public boolean isValid(Test value, ConstraintValidatorContext context) 
{
// your check logic
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("It should be different for(custom message) .."+ value.id).addConstraintViolation();
return false; // based on constraint filure.

}

しかし、私はあなたがフィールドレベルのアノテーションでこれをやりたいと思います!あなたの結果を楽しみにしていることについて私は知りません。

于 2011-01-22T15:35:13.693 に答える
0

これは実際には最も優れたソリューションではありませんが、最終的に行ったのは、トップレベルの例外処理コードに次のようなものを追加することでした。

String getConstraintViolationMessages(ConstraintViolationException e) {
    StringBuilder sb = new StringBuilder();
    for (ConstraintViolation<?> violation : e.getConstraintViolations()) {
        sb.append(getMessage(violation));
        sb.append("\n");
    }
    sb.setLength(sb.length() - 1);
    return sb.toString();
}

String getMessage(ConstraintViolation<?> violation) {
    String key = violation.getMessageTemplate();
    String messageFormat = localize(key);

    Object entity = violation.getRootBean();
    String identifier;
    if (entity instanceof PrimaryKeyed) {
        identifier = String.valueOf(((PrimaryKeyed) entity).getId());
    } else {
        identifier = entity.toString();
    }

    return MessageFormat.format(messageFormat, identifier);
}

PrimaryKeyedこれは、エンティティで使用されるカスタムインターフェイスであることに注意してください。上記に示されていない他のいくつかのインターフェースとカスタム処理もあります。

于 2013-09-09T11:33:26.953 に答える