0

これが Spring MVC 3.0 で可能かどうかはわかりませんが、別のコントローラーを拡張し、モデル属性が親によって設定されたモデル属性に依存する注釈付きコントローラーを作成しようとしています。例えば:

@Controller
public abstract class ParentModel {

    @ModelAttribute("numbers")
    protected List<Integer> getNumbers() {
        return Arrays.asList(new Integer(1));
    }

}

@Controller
public abstract class ChildModel extends ParentModel {

    @ModelAttribute("number")
    protected Integer getNumber(@ModelAttribute("numbers") List<Integer> numbers) {
        return numbers.get(0);
    }

}

@Controller
public class RequestHandler extends ChildModel {

    @RequestMapping("/number")
    public String items(@ModelAttribute("number") Integer number) {
        return "number"; // number.jsp
    }

}

これまでのところ、これを機能させることができませんでした。次の例外がスローされます。

リクエストの処理に失敗しました。ネストされた例外は org.springframework.beans.BeanInstantiationException: Bean クラスをインスタンス化できませんでした [java.util.List]: 指定されたクラスはインターフェイスです] 根本原因 org.springframework.beans.BeanInstantiationException: Bean クラスをインスタンス化できませんでした [java.util .List]: 指定されたクラスは、org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:762) の org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101) のインターフェースです。 ..など...

親によって設定された属性への依存が ChildModel.getNumber() から (パラメーターを削除することによって) 削除される@ModelAttribute("numbers") List<Integer> numbersと、両方のモデル属性メソッドが呼び出されます。ただし、ParentModel.getNumbers() は常に ChildModel.getNumber() の前に呼び出されます。

これを完全に機能させるために何か不足している場合、またはこれが不可能な場合はお知らせください。

前もって感謝します!

編集:

さらに実験を重ねた結果、モデル属性を他のモデル属性に依存させることはおそらくサポートされていないようです。両方のモデル属性メソッドを ParentModel に入れましたが、せいぜい散発的に機能します... 散発的な動作は、メソッドがリフレクションによって返される順序が原因である可能性があります。ParentModel.getNumbers() が ChildModel.getNumber() の前に (望ましい順序で) 呼び出されると、適切に機能します。これを発見したので、フォローアップの質問は次のとおりです。モデル属性メソッドが呼び出される順序を指定する方法はありますか?

4

2 に答える 2

3

インターフェースである List をインスタンス化できないため、Spring は不平を言っています。どちらもインターフェース List の実装であるArrayList (またはLinkedList ) として宣言してみてください。

于 2011-09-27T07:05:02.643 に答える
2

Springモデルの属性を誤って使用している可能性があります。モデルに属性を追加して再利用する1つの方法は、2番目の(依存する)メソッドに両方をモデルに追加させることです。例:

public abstract class ParentModel {

    // no longer annotated as model attribute
    // adds the attribute to the model if it does not exist
    protected List<Integer> getNumbers(Model model) {
        List<Integer> numbers = (List<Integer>) model.asMap().get("numbers");
        if (numbers == null) {
            numbers = Arrays.asList(new Integer(1));
            model.addAttribute("numbers", numbers);
        }
        return numbers;
    }

}

@Controller
public abstract class ChildModel extends ParentModel {

    @ModelAttribute("number")
    protected Integer getNumber(Model model) {
        return getNumbers(model).get(0);
    }

}

これがSpringMVC継承モデル入力コントローラーを設計するための良い方法であるかどうかはわかりませんが、今のところこれは機能します。

于 2011-11-01T22:57:58.227 に答える