8

独自のアノテーションと ConstraintValidator (JSR-303) を実装しました。検証プロセス中に、さまざまなエラー コードを作成したいと考えています。

public class SomeValidator implements ConstraintValidator<ConstraintAnnotation,SomeObject> {

    @Override
    public void initialize (ConstraintAnnotation constraintAnnotation) {
    }
    @Override
    public boolean isValid (SomeObject some, ConstraintValidatorContext context) {
        int parameter = some.getParameter();
        if (parameter==1){
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("SomeObject.code.first").addConstraintViolation();
            return false;
        }
        if (parameter==2){
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate("SomeObject.code.second").addConstraintViolation();
            return false;
        }
        return true;
    }
}

しかし、 context.buildConstraintViolationWithTemplate() は、コードではなくエラー メッセージを追加します。したがって、次のようなコードを展開するためのスプリングタイ:

ConstraintAnnotation.someObject

いいえ

SomeObject.code.second

メッセージの代わりにカスタム コードを追加するにはどうすればよいですか?

4

1 に答える 1

9

問題は非常に簡単に解決されました。

1) エラー コードを次のように {} で囲みます。

context.buildConstraintViolationWithTemplate("{SomeObject.code.first}").addConstraintViolation();

2) プロパティ ファイルをリソース フォルダーに追加します (これは maven プロジェクトのリソース フォルダーです)。

ValidationMessages_en_US.properties

ValidationMessages_en_US.properties ファイルの内容

SomeObject.code.first=Illegal link value

その検証の後、メッセージではなくコードが生成され、Spring はエラー コードを実際のメッセージに解決します。

ノート:

  1. 実際、春のプロジェクトのどこにでも ValidationMessages_en_US.properties (および他の i18n プロパティ ファイル) を置くことができます。他の場所に配置する場合は、LocalValidatorFactoryBean を構成する必要がありますが、理論的には実際にはできませんでした。私の場合、コードが解決されず、プロパティ ファイルをリソース フォルダーに配置しました。
  2. 次のようなカスタム エラー メッセージを作成できます。「エラー メッセージ。{error.code}」および「error.code」は、ファイル内のプロパティに置き換えられます。JSR-303仕様を参照
于 2013-04-12T01:12:48.003 に答える