java-无法使用spring数据功能绑定数据

主题继续在sending-data-back-to-controller-spring-mvc

我正在一个产品详细信息页面上,我需要向用户显示一些选项,并且用户将选择其中的几个选项,并且在“提交”按钮上,产品应添加到购物篮中.
我的意图是将该数据对象传输到我的购物车控制器,以便我可以使用这些值,并且由于该对象包含动态值,因此无法定义预定字段对象.
这是我的数据对象

public class PrsData {
    private Map<String, List<PrsCDData>> prsCDData;

    public PrsData(){
        this.prsCDData = MapUtils.lazyMap(new HashMap<String, List<PrsCDData>>(),
        FactoryUtils.instantiateFactory(PrsCDData.class));
    }
} 

public class PrsCDData {
    private Map<String, List<ConfiguredDesignData>> configuredDesignData;
    // same lazy map initialization
}

在我的产品详细信息页面控制器中,将值设置为:

model.addAttribute("prsData", productData.getPrsData());

在我的产品详细信息页面JSP上,我的表单是这样的:

<form:form method="post" commandName="prsData" action="${addProductToCartAction}" >
    <form:hidden path="prsCDData[''${prsCDDataMap.key}'']
                    [${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
                    [${configuredDesignDataStatus.index}].code" />
</form:form>

但是当我单击提交按钮时,出现以下异常

org.springframework.beans.InvalidPropertyException: 
    Invalid property 'prsCDData['Forced'][0]' of bean class [com.product.data.PrsData]: 
        Property referenced in indexed property path 'prsCDData['Forced'][0]' 
        is neither an array nor a List nor a Set nor a Map; 
        returned value was [com.product.data.PrsCDData@6164f07e]

我不确定我在哪里做错了,因为在产品详细信息页面上,这些隐藏的字段正确地绑定了,甚至为它们分配了值,但是在提交表单时,我遇到了这个问题.

解决方法:

LazyMap工厂必须返回LazyList.

给定的FactoryFactoryUtils.instantiateFactory(PrsCDData.class)将创建一个新的PrsCDData对象,而不是PrsCDData列表.

prsCDData['Forced'] -> if exists then return it else create instance of PrsCDData.class

应该

prsCDData['Forced'] -> if exists then return it else create instance of LazyList<PrsCDData>

使用LazyList,因为您立即要访问索引“ 0”,否则将导致ArrayIndexOutOfBoundsExecption

编辑:简单的例子

public class Test {

@SuppressWarnings("unchecked")
public static void main(String[] args) throws UnsupportedEncodingException {

    Map<String, List<SimpleBean>> map = MapUtils.lazyMap(new HashMap<String,List<Object>>(),new Factory() {

        public Object create() {
            return LazyList.decorate(new ArrayList<SimpleBean>(), FactoryUtils.instantiateFactory(SimpleBean.class));
        }
    });

    System.out.println(map.get("test").get(0));
}

public static class SimpleBean {
    private String name;
}

}
上一篇:JSTL


下一篇:mysql-javax.servlet.jsp.JspException:无法建立连接,数据源无效:“ java.sql.SQLException:未找到合适的驱动程序”