2017-08-03 26 views
1

私の春@RestControllerにエンドポイントの@RequestBodyを検証したいと思います。だから私はこのような方法で作成しました:Bean検証 - ConstraintViolationExceptionをカスタマイズするには?

@RequestMapping(value = ...) 
public ResponseEntity<...> myPostMethod(@RequestBody MyBean myBean) throws Exception { 

MyBeanをカスタム@Constraintが飾られており、そのそれぞれの検証ロジックは、私が作成しConstraintValidatorクラスに実装されています。このバリデーターは次のようなメソッドを持っています:

@Override 
public boolean isValid(MyBean value, ConstraintValidatorContext context) { 

これはすべての検証ロジックが行われる場所です。それが失敗すると、isValidfalseを返し、私はそのcontext paramを使用して、検証エラーメッセージを作成します。さらに、myPostMethodも自動的に失敗します(私は自分で投げないので)MethodArgumentNotValidException汎用ハンドラでキャプチャして汎用ResponseEntityをレンダリングするつもりです。それはすべて期待どおりに動作します。 質問:検証エラーメッセージだけでなく、ConstraintViolationException全体をカスタマイズするにはどうすればよいですか?私はレスポンスボディjsonでレンダリングする例外の中に(私のビジネスドメインから)より多くのデータを提供したいと思います。

いずれのチップも高く評価されます。

答えて

1

私は答えを見つけた:

https://docs.jboss.org/hibernate/validator/5.4/api/org/hibernate/validator/constraintvalidation/HibernateConstraintValidatorContext.html#withDynamicPayload-java.lang.Object-

public boolean isValid(MyBean value, ConstraintValidatorContext constraintValidatorContext) { 
    HibernateConstraintValidatorContext context = constraintValidatorContext.unwrap(HibernateConstraintValidatorContext.class); 

    // (...) 

    context.buildConstraintViolationWithTemplate("{foo}") 
     .withDynamicPayload(anyAdditionalInfo) 
     .addConstraintViolation(); 

    return false; 
} 
関連する問題