Spring MVC でデータをバインドして変換する最も簡単で簡単な方法を探しています。可能であれば、xml 構成を行わずに。
これまでのところ、私はPropertyEditorsを次のように使用してきました:
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 config に 3 行追加できます。
しかし、Spring 3.x では、 Convertersを使用してそれを行う新しい方法が導入されました。
Spring コンテナー内では、このシステムを PropertyEditor の代替として使用できます。
それで、「最新の代替手段」であるため、コンバーターを使用したいとしましょう。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 つのクラスを作成する必要があります。利点 : 汎用性のおかげでキャストする必要がありません。
次に、コンバーターを単純にデータバインドするにはどうすればよいですか?
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()); } }
これらすべての欠点があるのに、なぜ Converters を使用するのでしょうか? 何か不足していますか?私が気付いていない他のトリックはありますか?
私は PropertyEditors を使い続けたいと思っています... バインディングははるかに簡単で迅速です。