0

我不確定在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()時,它可以正常工作。發現了這個後,我的後續問題是:有沒有一種方法來指定調用模型屬性方法的順序?

回答

2

我可能使用了不正確的Spring模型屬性。將屬性添加到模型和重用的一種方式是讓第二(依賴)方法他們都添加到模型,如:

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); 
    } 

} 

我不知道這是否是一個好辦法設計Spring MVC也會繼承模型填充控制器,但現在這個工作。

3

Spring在抱怨,因爲它不能實例化一個List,它是一個接口,嘗試聲明它爲ArrayList(或LinkedList),它們都是接口List的實現。

+1

感謝您的建議,但是這樣做會導致ArrayOutOfBoundsException。 Spring可能使用no-args構造函數來創建一個空列表,因爲它仍然在parent.getItems()之前調用child.getItem()。 – andy