[英]Spring MVC binding nested objects
我有一個以下類的實例,我想在from中編輯,然后將其保存在后端。
public class NestedClass {
List<InnerClass> inners = new LinkedList<InnerClass>();
//getter and setter
public class InnerClass {
private String innerField;
//getter and setter
}
}
編輯:編輯的示例代碼符合@Slava Semushin的建議。
當我實例化該類並將其傳遞給模型時,我可以使用以下jsp片段讀取值:
<form:input path="inners[0].innerField" /><br/>
<form:input path="inners[1].innerField" /><br/>
但當我傳回來時,我得到以下異常:
Invalid property 'inners[0]' of bean class [com.sodacrm.webapp.forms.NestedClass]: Illegal attempt to get property 'inners' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'inners' of bean class [com.sodacrm.webapp.forms.NestedClass]: Could not instantiate property type [com.sodacrm.webapp.forms.NestedClass$InnerClass] to auto-grow nested property path: java.lang.InstantiationException: com.sodacrm.webapp.forms.NestedClass$InnerClass
org.springframework.beans.InvalidPropertyException: Invalid property 'inners[0]' of bean class [com.sodacrm.webapp.forms.NestedClass]: Illegal attempt to get property 'inners' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'inners' of bean class [com.sodacrm.webapp.forms.NestedClass]: Could not instantiate property type [com.sodacrm.webapp.forms.NestedClass$InnerClass] to auto-grow nested property path: java.lang.InstantiationException: com.sodacrm.webapp.forms.NestedClass$InnerClass
真正的類我正在使用的是3級深度,我不想將內部類放在單獨的文件中,因為它們非常屬於他們的外部類...
你如何為inners
成員定義吸氣劑? 檢查它是否總是返回有效列表:
List<InnerClass> inners = new LinkedList<InnerClass>();
要么
public List<InnerClass> getInners() {
if (inners == null) {
inners = new LinkedList<InnerClass>();
}
return inners;
}
原因是內在階級。 Spring實例化內部類純粹給定內部類類型,此類沒有對NestedClass
實例的引用,因此實例化失敗(因為InnerClass
實例只能存在於NestedClass
實例的NestedClass
)
不幸的是,修復是將InnerClass移出NestedClass的范圍或將其聲明為靜態內部類。 此外,您不需要實例化內部列表,它將自動實例化為ArrayList
。
這可能值得Jira票,因為它似乎是對Spring框架的一個很好的增強。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.