Spring MVC绑定嵌套对象

时间:2014-03-28 13:32:25

标签: java spring inner-classes spring-form

我有一个以下类的实例,我想在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级深度,我不想将内部课程分成不同的文件,因为它们非常属于他们的外部课程......

2 个答案:

答案 0 :(得分:0)

如何为inners成员定义getter?检查它是否总是返回有效列表:

List<InnerClass> inners = new LinkedList<InnerClass>();

public List<InnerClass> getInners() {
    if (inners == null) {
        inners = new LinkedList<InnerClass>();
    }
    return inners;
}

答案 1 :(得分:0)

原因是内在阶级。 Spring实例化内部类纯粹给定内部类类型,此类没有对NestedClass实例的引用,因此实例化失败(因为InnerClass的实例只能存在于NestedClass)实例的上下文

不幸的是,修复是将InnerClass移出NestedClass的范围或将其声明为静态内部类。此外,您不需要实例化内部列表,它将自动实例化为ArrayList

这可能值得Jira票,因为它似乎是对Spring框架的一个很好的增强。