2012-07-02 9 views
7

代わりに、コンストラクタを使用しており、この種のもの与え無視します。私は、私は文字列を取るコンストラクタを削除しない限り、登録されたプロパティエディタが呼び出されていなかったことがわかっSpring MVCのは、PropertyEditorは設定され、春3.1を使用して

class Thing { 
    public Thing() {} 
    public Thing(String someProperty) {} 
} 

class ThingEditor extends PropertyEditorSupport{ 
    @Override 
    public void setAsText(String text) { 
     if (text != null) { 
      Thing thing = new Thing(text); // or by using a setter method 
      setValue(thing); 

     } 

    } 
} 

class SomeController { 
    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(Thing.class, new ThingEditor()); 
    } 
} 

Thing - これは正しいですか?

なぜこれを実行して登録されたエディタを無視し、これをやりなおすことができますか?

+0

あなたは上記いるsetAsText方法のもう少しを示してくださいすることができます。 –

+0

更新されましたが、このメソッドの内容は問題ではありません。デバッグ時には、クラスにStringコンストラクタがある場合、このメソッドには絶対に入りません。 – blank

+0

は、おそらくあなたは「someProperty」と同じ名前のフィールドを提出しているので、その場合には、「シング」オブジェクトを作成するために、バインダーを呼び出しますが、セッターまたはプロパティを設定するためのコンストラクタを使用することはできません。名前の "物"でプロパティを提出し、明示的に@RequestParam(..)を置く方が良いかもしれませんが、これはバインダーを強制するかもしれません。 –

答えて

0

独自のコンストラクタを導入することで、コンパイラによって生成されるデフォルトコンストラクタを無効にします。デフォルトのコンストラクタはおそらく、あなたのものをインスタンス化できるようにするために、フレームワークによって必要とされます。独自のコンストラクタが本当に必要な場合は、フレームワークを使用するためのパラメータを持たないバージョンを提供することもできます。あなたがPropertyEditorSupportを登録する際に

+0

Thsのデフォルトのコンストラクタもそこにありました。それを質問に追加しました。 – blank

0

は、プロパティ名をロック:

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Thing.class, "someProperty", new ThingEditor()); 
} 
関連する問題