1

クラスがあるとします:

abstract class Animal {}

class Elephant extends Animal {
    Trunk trunk;
    RightEar rightEar;
}

class Peacock extends Animal {
    Tail tail;
    Beak beak;
}

そして、 type のパラメーターを持つ単一のコントローラーメソッドを作成したいと思いますAnimal

@RequestMapping("/animal")
public ModelAndView animalsHandler(@ModelAttribute("animal") Animal animal) {...}

複雑でないパラメーターの場合、適切なinメソッドを選択することで実行できることがわかりました。つまり、入力文字列をさまざまな方法で変換するだけです。propertyEditor@InitBinder

しかし、内部に他のオブジェクトがある場合ElephantPeacockどうなるでしょうか? propertyEditorその場合、 s を書くことはできないようですがTrunk、 ,TailBeak? .. 私は完全に混乱しています。

4

1 に答える 1

1

requestmapper が requestparameters で満たされる正しいインスタンスを作成できることが重要です。これが完了すると、beanwrapper はデフォルトの動作で属性を処理できるようになります。したがって、動物モデル属性の孔雀インスタンスを作成できる必要があり、問題ないはずです。

これは私がそれを行った方法です:(エンティティを解決するためにそれを行いました)

  • 起動時にエンティティをスキャンし、simpleclassname と class のマップを保持するコンポーネントを作成します

  • 上記のコンポーネントを使用して文字列を解決する StringToEntityConverter を作成し、ConversionService (SimpleClassName_Identifier) に登録します。

  • 次のようなリクエスト パラメータを送信します: SimpleClassName_Identifier

これが適切に行われると、リクエストパラメータがエンティティである場合にコンバータが起動し、それを変換します。

共通の基本クラスと ID としての整数をすべて持つエンティティに対してそれを行ったので、スキャンは非常に簡単でした。コンバーターは文字列を取得して分割し、id が null でない場合はエンティティ マネージャーを使用してエンティティをフェッチし、id が null の場合は新しいインスタンスを作成します。この時点から、すべてのリクエスト マッピングは、エンティティ インスタンスをリクエスト パラメータとして直接持つことができます。

とにかく、すべてのjpaエンティティには一意の単純な名前が必要なため、ここではsimpleclassnameが機能しています!

名前からクラスへのマッピングを持つコンポーネントが必要ない場合は、完全なクラス名を送信することもできます。また、新しいインスタンスのみが必要な場合、コンバーターはクラス名だけを必要とします。

于 2013-05-17T07:29:54.663 に答える