2

このコードでは、org.springframework.validation.beanvalidation.LocalValidatorFactoryBeanにサブクラスを実装し、検証を実行し、追加の処理を実行し、エラーメッセージを登録する独自の実装でvalidate(オブジェクトターゲット、エラーエラー)をオーバーライドしました。

3.0から3.1にアップグレードすると、このメソッドは呼び出されなくなったようです。同僚がSpringコードをデバッグしたところ、代わりに署名validate(Object target、Errors errors、Object ... validateHints)を持つメソッドが呼び出され、古いvalidate()がスキップされているようです。validateHintsでメソッドを使用するように変更すると、動作が再開されました。

この修正は、ちょっと奇妙に感じられ、将来混乱する傾向があります。より将来性のある検証を処理する別の方法はありますか?

4

1 に答える 1

5

私たちのプロジェクトでは、少し異なるアプローチを取りました。また、Spring 3.1 を使用しており、検証とカスタム検証で注釈が付けられた両方の Bean があります。Spring 3.1に移行する前に最初に使用した方法がわからないため、私たちのアプローチはあなたのシナリオに当てはまる場合と当てはまらない場合がありますが、ここでは.

カスタム検証が必要な場合は、LocalValidatorFactoryBean を拡張する代わりに、org.springframework.validation.Validator クラスを実装します。したがって、この実装は独自のカスタム コードを実行し、Spring のデフォルトの検証を呼び出します。この検証は、カスタム バリデーターに自動配線された Bean を介して公開されます。バリデータコードは次のとおりです。

@Component("myValidator")
public class MyValidator implements Validator {

@Autowired
private Validator springValidator;

@Override
public boolean supports(Class<?> clazz) {
    return MyObject.class.isAssignableFrom(clazz);
}

@Override
public void validate(Object object, Errors errors) {
    MyObject myObject = (MyObject) object;

    // invoke spring default validator so validation annotations are processed
    springValidator.validate(myObject, errors);

    // custom validation
    ....

そして、Spring xml ファイルで宣言された次の Bean があります。

<bean id="springValidator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

上記の実装では、バリデーションを呼び出す必要があるクラスは、validator.validate(Object object, Errors errors) を呼び出すことによってそうします。繰り返しますが、同じ validate(Object, Errors) メソッドを使用していたかどうかわからないため、私たちのプロジェクトで採用されたアプローチがあなたのプロジェクトに適用されるかどうかわかりません。

とにかく、それが役立つことを願っています。

于 2012-10-31T12:49:47.740 に答える