我不確定在Spring MVC 3.0中是否可以這樣做,但我試圖創建一個註釋的Controller來擴展另一個Controller,並且其模型屬性依賴於由父級設置的模型屬性。例如: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]:指定的類是一個接口 at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java: 762)...等...
當在由父設置屬性的依賴性被從ChildModel.getNumber()(通過去除@ModelAttribute("numbers") List<Integer> numbers
參數去除),這兩個模型屬性方法被調用。但是,ParentModel.getNumbers()始終在ChildModel.getNumber()之前調用。
請讓我知道如果我失去了一些東西,讓這個完全正常工作,或者這是不可能的。
在此先感謝!
編輯:
後一些更多的試驗,似乎爲模型的屬性依賴於其他模型屬性可能是不支持。我將兩個模型屬性方法都放到了ParentModel中,並且它最多隻能偶爾運行......零星的行爲可能是由於反射返回方法的順序。在ChildModel.getNumber()(需要的順序)之前調用ParentModel.getNumbers()時,它可以正常工作。發現了這個後,我的後續問題是:有沒有一種方法來指定調用模型屬性方法的順序?
感謝您的建議,但是這樣做會導致ArrayOutOfBoundsException。 Spring可能使用no-args構造函數來創建一個空列表,因爲它仍然在parent.getItems()之前調用child.getItem()。 – andy