[解決済み] Spring MVCの型変換:PropertyEditorかConverterか?
質問
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が適していると思います。
関連
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
サーブレットクラスのインスタンス化エラーの解決法
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
[解決済み] Java文字列→日付変換
-
[解決済み] Spring Bootアプリケーションにポートを設定する方法
-
[解決済み] Springのオートワイヤリングの仕組みは?
-
[解決済み] Spring MVCの@ResponseBodyメソッドがStringを返すときにHTTP 400エラーで応答するにはどうすればよいですか?
-
[解決済み] Spring MVCの@ModelAttributeとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java Error スレッド "AWT-EventQueue-0" で例外発生 java.lang.
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
javaでクラスを作成すると、enclosing classでないように見える
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について