これらのトピックに関する spring2.5 に関する本はほとんど読んでいませんが、@initBinder をいつ使用するかの概念をまだ理解できていません。誰でも参照を共有したり、Webアプリケーションでこれを使用できる状況を説明したりできますか? propertyEditor はどのように関連していますか?
3 に答える
本よりもうまく言えませんが、コントローラーに @InitBinder で注釈が付けられたパブリック メソッドがある場合、これらのメソッドは、各要求が処理される直前にコンテナーによって呼び出され、使用されている WebDataBinder に渡されます。枠組み。
これを行う最も一般的な理由は、Spring が要求パラメーターをモデルにバインドしようとする方法をカスタマイズする場合です。たとえば、Spring がそのままでは処理できないカスタム データ型がモデルに含まれている場合などです。PropertyEditor を WebDataBinder に対して登録します。モデルで JodaTime ライブラリを使用していて、タイムスタンプ文字列を Joda DateTime オブジェクトにバインドしたい場合が簡単な例です。
Spring 2.0 では、コントローラーのスーパークラスから保護された initBinder() メソッドをオーバーライドする必要がありましたが、Spring 2.5 ではその必要がなくなり、アノテーションを使用できるようになりました。
skaffman が言及したこと以外のもう 1 つの理由は、WebDataBinder にカスタム バリデーターを設定することです。私が通常行うことは、JSR-303 Bean 検証を使用してから、JSR-303 では提供されない追加の検証を提供するバリデーターをバインドすることです。
コントローラーの内部:
@InitBinder
protected void initBinder(WebDataBinder webDataBinder) {
Validator validator = webDataBinder.getValidator();
webDataBinder.setValidator(new UserFormValidator(validator));
}
私がやっていることは、Bean バリデーターを取り込んで、それをカスタム バリデーター内で呼び出してから、カスタム バリデーションを呼び出すことです。このようなもの:
public class UserFormValidator implements Validator {
private Validator validator;
public AuthUserFormValidator(Validator validator) {
this.validator = validator;
}
@Override
public boolean supports(Class<?> clazz) {
return UserForm.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
// Run the bean validation...
validator.validate(target, errors);
// Do your custom validation on userForm here...
UserForm userForm = (UserForm) target;
// Validation on userForm...
}
}
Spring 2.5.1 以降が必要ですhttps://jira.springsource.org/browse/SPR-4182を参照してください