1. ホーム
  2. java

[解決済み] Spring MVCの型変換:PropertyEditorかConverterか?

2022-06-19 22:13:40

質問

Spring MVCでデータをバインドして変換するための最も簡単でシンプルな方法を探しています。可能であれば、任意のxml構成を行うことなく、。

今までのところ、私は プロパティエディタ をこのように使っています。

public class CategoryEditor extends PropertyEditorSupport {

    // Converts a String to a Category (when submitting form)
    @Override
    public void setAsText(String text) {
        Category c = new Category(text);
        this.setValue(c);
    }

    // Converts a Category to a String (when displaying form)
    @Override
    public String getAsText() {
        Category c = (Category) this.getValue();
        return c.getName();
    }

}

...
public class MyController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Category.class, new CategoryEditor());
    }

    ...

}

単純なことです。両方の変換が同じクラスで定義されており、バインディングは単純です。もし、すべてのコントローラに対して一般的なバインディングを行いたかったら、このように 3 行を xml 設定に追加することができます。 .


しかしSpring 3.xでは、新しい方法として コンバータ :

<ブロッククオート

Springコンテナ内では、このシステムを PropertyEditorの代わりとして使うことができます。

では、Convertersが最新の代替品であるから使いたいとしましょう。私は 2つの コンバータを作成しなければなりません。

public class StringToCategory implements Converter<String, Category> {

    @Override
    public Category convert(String source) {
        Category c = new Category(source);
        return c;
    }

}

public class CategoryToString implements Converter<Category, String> {

    @Override
    public String convert(Category source) {
        return source.getName();
    }

}

最初の欠点: クラスを2つ作らなければならない。利点:汎用性があるため、キャストする必要がない。

では、コンバータを単純にデータバインディングするにはどうすればよいのでしょうか?

第二の欠点: コントローラでこれを行う簡単な方法(アノテーションや他のプログラム的な機能)は見つかっていません。 someSpringObject.registerCustomConverter(...); .

私が見つけた唯一の方法は、面倒で、単純ではなく、一般的なクロスコントローラ結合についてだけでしょう :

  • XMLコンフィグ :

    <bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="somepackage.StringToCategory"/>
                <bean class="somepackage.CategoryToString"/>
            </set>
        </property>
    </bean>
    
    
  • Java の設定 ( Spring 3.1+のみ ) :

    @EnableWebMvc
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
    
        @Override
        protected void addFormatters(FormatterRegistry registry) {
            registry.addConverter(new StringToCategory());
            registry.addConverter(new CategoryToString());
        }
    
    }
    
    

このような欠点があるのに、なぜコンバータを使うのですか?私は何かを見逃しているのでしょうか?私が知らない他のトリックがあるのでしょうか?

私は PropertyEditor を使い続けたいのですが...。バインディングははるかに簡単で迅速です。

どのように解決するのですか?

このような欠点があるのに、なぜコンバーターを使うのですか?私は何かを見逃しているのでしょうか? 何か?私が知らない他のトリックがあるのでしょうか?

いいえ、PropertyEditorとConverterの両方について、それぞれがどのように宣言され登録されるのか、非常に包括的に説明されていると思います。

私の考えでは、PropertyEditorは範囲が限定されています。Stringを型に変換するのに役立ち、このStringは通常UIから来るので、@InitBinderを使用してPropertyEditorを登録し、WebDataBinderを使うことは理にかなっていると思います。

一方、Converterはより汎用的で、UI関連の変換(String to target type)だけでなく、システム内のあらゆる変換を目的としています。例えば、Spring Integrationはメッセージペイロードを目的の型に変換するためにコンバータを広く使用します。

UI関連のフローでは、PropertyEditorは特に特定のコマンドプロパティに対してカスタムで何かを行う必要がある場合に適していると思います。

UI関連のフローではPropertyEditorが適していると思います。