6

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

これの前に私は使用しました:

<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>

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

4

2 に答える 2

3

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

Spring 3.0は、変換とフォーマットの新しい異なるサポートを追加しました。一部の変更には、「core.convert」パッケージと「format」パッケージが含まれており、ドキュメントによると、「PropertyEditorsのより単純な代替手段として使用できます」。

さて、あなたの質問に答えるために、はい、あなたは正しい軌道に乗っているように見えます。どちらも引き続き使用できますが、長い話を短くするために、多くの場合、データバインダーの代わりにコンバーターを使用できるはずです。

検証を追加する方法に関するドキュメントは、オンラインで入手できます

于 2012-02-07T16:24:15.757 に答える
2

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

しかし、SpringがそもそもPropertyEditorsを使用した理由はわかりません。マルチスレッド以外の環境とSpringMVCより前の日付を対象としていたのでしょうか。

編集:

ただし、PropertyEditorSupportはスレッドセーフに見えませんが、Springはスレッドセーフな方法で使用されることを保証します。たとえば、データバインディングが必要になるたびに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()が呼び出されました」。バインディングが発生するたびに複数回表示される可能性があります。

于 2012-07-29T10:41:33.973 に答える