2012-02-07 9 views
5

SpringのDataBinderとConversionServiceの使用と目的がモデルオブジェクトへのWeb要求のバインドに関して混乱しています。これは、JSR-303検証を最近追加しようとしたために発生しました。これに先立ちSpringのDataBinderとConversionServiceの違い

私が使用:

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="mypackage.GlobalWebBindingInitializer" /> 
    </property> 
</bean> 

を、私はいくつかのコントローラで使用できるグローバルのDataBinderを望んでいたので、これは良かったです。 GlobalWebBindingInitialzerクラス内 は、これらのいくつかの実装:

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class) 

私は@Validアノテーションを使用したかったので、追加が。この副作用は、上記のAnnotationMethodHandlerAdapter Beanがアノテーション駆動の一部としてすでに定義されているため、グローバルデータバインダーが無視されることです。

は、だから今、私はこのクラスを作成しました:

public class MyClassConverter implements Converter<String, MyClass> 

私は混乱しています。データバインダーではなく変換サービスを使用する必要がありますか?

答えて

3

歴史的に、Springのデータバインディングは、データをjavabeansに変換するために使用されました。これは変換を行うためにJavaBean PropertyEditorsに大きく依存しています。

変換と書式設定。いくつかの変更には、 "core.convert"パッケージと "書式"パッケージが含まれていて、ドキュメントごとに "PropertyEditorsのより簡単な代替手段として使用されるかもしれません。

あなたの質問に答えるために、はい、あなたは正しい軌道にいるようです。どちらか一方を引き続き使用することができますが、多くの場合、データバインダーの代わりにコンバータを使用できるはずです。

検証を追加する方法についてのドキュメントis available online

1

上記の回答に加えて、PropertyEditors(esp PropertyEditorSupport)はスレッドセーフではありません。特に、各リクエストが別のスレッドで処理されるWeb環境では必要です。理論的には、PropertyEditorsは非常に並行した条件下では予測できない結果をもたらすはずです。

なぜSpringがPropertyEditorsを最初に使用したのか不明です。 SpringMVCの前の非マルチスレッド環境と日付のためのものだったかもしれませんか?

EDIT:

、がPropertyEditorSupportはスレッドを見ていない安全な春が確実にそのスレッドセーフな方法で使用されます。たとえば、initBinder()は、データバインディングが必要なたびに呼び出されます。コントローラが初期化されたときに呼び出されたということは間違っていました。

@InitBinder 
public void initBinder(WebDataBinder binder) { 

    logger.info("initBinder() called."); 

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    dateFormat.setLenient(false); 

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
      dateFormat, false)); 
} 

ここでは、 "initBinder()"というログが記録されます。バインディングが発生するたびに複数回表示されます。

関連する問題