在Spring MVC中绑定列表映射

问题描述 投票:7回答:2

我不确定这是否是一个复杂的问题,但是作为一个开始的人,这对我来说似乎有点复杂。我有一个基于它的对象,我需要在UI上显示一些值并让用户选择其中的一些值,当用户单击“提交”按钮时,我需要将数据发送回另一个控制器。这是我的数据对象的结构] >

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

public class PrsCDData{
  private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
}

public ConfiguredDesignData{
  // simple fields
}

在显示类似视图之前,我已经在模型中设置了对象

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

以我具有以下设置的形式

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

<form:hidden path="prsCDData['${prsCDDataMap.key}']
  [${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
  [${configuredDesignDataStatus.index}].description"/>

</form:form>

这是我在AddProductToCartController拥有的

public String addToCart(@RequestParam("productCodePost") final String code,
@ModelAttribute("prsData") final PrsData prsData, final Model model,
@RequestParam(value = "qty", required = false, defaultValue = "1") final long qty)

在提交表格时,我将获得以下例外

org.springframework.beans.NullValueInNestedPathException: Invalid property 'prsCDData[Forced][0]' 
of bean class [com.product.data.PrsData]: 
Cannot access indexed value of property referenced in indexed property path 'prsCDData[Forced][0]': returned null

似乎是它试图访问此控制器上的值,而我正在尝试将值发送到该控制器并尝试创建具有选定值的相同对象

任何人都可以告诉我我在哪里做错了,我需要照顾什么

编辑

我进行了更多研究,得知Spring不支持为自定义对象自动填充列表/地图,并且基于我试图更改实现的答案,例如

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

    public class PrsCDData{
      private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
      public PrsCDData()
    {

       this.configuredDesignData = MapUtils.lazyMap(new HashMap<String,  
                                      List<ConfiguredDesignData>>(),
            FactoryUtils.instantiateFactory(ConfiguredDesignData.class));

    }
    }

但是我正在跟踪异常

org.springframework.beans.InvalidPropertyException: 
Invalid property 'prsCDData[Forced][0]' of bean class [com.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.data.PrsCDData@6043a24d]

我不确定我做错了什么,似乎我的JSTL表达式都不正确

我不确定这是否是一个复杂的问题,但是作为一个开始的人,这对我来说似乎有点复杂。我有一个对象,基于该对象,我需要在UI上显示一些值,并让用户选择......>

java jsp spring-mvc jstl
2个回答
9
投票

说明:

如果您的控制器中有@ModelAttribute("user") User user,并且加载了包含<form:form commandName="user">的相应页面,则会实例化一个空用户。

0
投票

我面临相同的问题。请告知!


    private Map<String, List<ScheduledTransfer>> scheduledTransferListMap = new LinkedHashMap<String, List<ScheduledTransfer>>();
    private List < ScheduledTransfer > scheduledTransferList =
            new ArrayList < ScheduledTransfer > ();


<form:hidden                path="scheduledTransferListMap[${scheduledTransferRecordsMap.key}][0].transferDate" />


Error:

javax.servlet.jsp.JspException: org.springframework.beans.NullValueInNestedPathException: Invalid property 'scheduledTransferListMap[108195][0]' of bean class [com.pnc.tsc.rtx.vo.ScheduledTransferVO]: Cannot access indexed value of property referenced in indexed property path 'scheduledTransferListMap[108195][0]': returned null
© www.soinside.com 2019 - 2024. All rights reserved.