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());
}
...
}
簡単です。両方の変換は同じクラスで定義されており、バインディングは簡単です。すべてのコントローラに共通のバインディングを行いたい場合は、以下を追加できます。私のXML設定の3行。
しかし、Spring 3.xでは、新しい方法が導入されました。コンバーター:
Springコンテナ内では、このシステムはPropertyEditorsの代替として使用できます。
では、コンバーターを「最新の代替手段」として使いたいとします。そのためには、二コンバーター:
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 つのクラスを作成する必要があります。利点: 汎用性によりキャストする必要がありません。
では、コンバーターを単純にデータバインドするにはどうすればよいでしょうか?
2つ目の欠点:コントローラーでこれを行うための簡単な方法 (アノテーションやその他のプログラム機能) が見つかりませんでした。 のようなものはありませんsomeSpringObject.registerCustomConverter(...);
。
私が見つけた唯一の方法は、面倒で、単純ではなく、一般的なクロスコントローラーバインディングに関するものでした。
-
<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()); } }
これらすべての欠点があるのに、なぜコンバーターを使用するのでしょうか? 何か見落としているのでしょうか? 私が知らない他のトリックがあるのでしょうか?
PropertyEditors を使い続けたいと思うのですが... バインディングの方がはるかに簡単で早いです。
ベストアンサー1
これらすべての欠点があるのに、なぜコンバーターを使用するのでしょうか? 何か見落としているのでしょうか? 私が知らない他のトリックがあるのでしょうか?
いいえ、PropertyEditor と Converter の両方について、それぞれがどのように宣言され登録されるかを非常に包括的に説明していると思います。
私の考えでは、PropertyEditor は範囲が限定されています。PropertyEditor は文字列を型に変換するのに役立ち、この文字列は通常 UI から取得されるため、@InitBinder を使用して PropertyEditor を登録し、WebDataBinder を使用することは理にかなっています。
一方、コンバーターはより汎用的で、UI 関連の変換 (文字列からターゲット タイプへの変換) だけでなく、システム内のあらゆる変換を対象としています。たとえば、Spring Integration では、メッセージ ペイロードを目的の型に変換するためにコンバーターを広範に使用しています。
UI 関連のフローでは、特に特定のコマンド プロパティに対してカスタム操作を行う必要がある場合には、PropertyEditors が依然として適切だと思います。その他の場合は、Spring リファレンスの推奨事項に従って、代わりにコンバーターを作成します (たとえば、サンプルとして、Long ID からエンティティに変換するなど)。