2016-08-08 2 views
0

私はStringを保持する値オブジェクトを持っています。そのStringはいくつかの制限(長さ、許容される文字など)の対象となります。コンストラクタのJavaバリデータアノテーションの使い方は?

オブジェクトの検証にJavaまたはSpring検証APIを使用したいと思います。 作成時に(コンストラクタ内で)自分のドメインオブジェクトを検証したいと思います。 (this使用して検証APIを検証する)ことを認識

サンプルコードは:

void validate() { 
     LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
     Set<ConstraintViolation<Msisdn>> violations = localValidatorFactoryBean.getValidator().validate(this); 
     if (!violations.isEmpty()) { 
      throw new ConstraintViolationException(violations); 
     } 
    } 

私は、コンストラクタからjavax.validation.Validatorのインスタンスを取得する方法がわかりません。 Spring管理コード(サービス)私はjavax.validation.Validator またはorg.springframework.validation.Validatorのちょうど@Autowireインスタンスを可能性があり、それが作品に

しかし、バリューマネージドコードの外で(バリューオブジェクトのコンストラクタ内で、それは自分で立っています)、それを動作させるにはどうすればいいですか?

私はifsを使って検証ルールを書くことができますが、検証アノテーションはコードをもっと簡単にすることができます。

答えて

0

Hibernate Validator documentation describes how to get instance of javax.validation.Validator

ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
Validator validator = factory.getValidator(); 

しかし、コンストラクタでValidatorFactoryを構築するためには適していません。時間のかかる操作です。たぶん、thrad-localのキャッシュされた参照を使用すると助けになるかもしれませんが、複雑さが増していくのは嫌です。

最後に、私が使用して私の値オブジェクトの検証ルールを記述することを決定した Guava Preconditions

Preconditions.checkNotNull(value, "value cannot be null"); 
関連する問題