当前位置: 首页 > 知识库问答 >
问题:

在Spring MVC中绑定列表映射

诸葛皓
2023-03-14
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>
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

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

有谁能告诉我,我哪里做错了,我需要注意什么

编辑

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表达式不对

共有1个答案

冯胤
2023-03-14

说明:如果在您的控制器中有@modelattribute(“User”)User User,并且您加载了一个包含 的相应页面,则会实例化一个空用户。

它的所有属性都为null,如果是列表或映射,则为空。此外,它的空列表/映射已经用自动增长实现实例化。这是什么意思?假设我们有一个空的自动增长列表 coconuts 。如果我执行coconuts.get(someIndex).SetDiameter(50),它将工作,而不是抛出异常,因为列表会自动增长并为给定索引实例化一个coconut。
由于这种自动增长,提交具有以下输入的表单将非常有效:

<form:input path="coconuts[${someIndex}].diameter" />

现在回到您的问题:Spring MVC autogrowing很好地处理对象链,每个对象都包含一个映射/列表(参见本文)。但是给出了您的例外情况,看起来Spring并没有自动增长由自动增长的列表/映射包含的可能对象。在map >prscddata 中,list 只是一个没有自动增长的空列表,因此导致您的异常

public class PrsData {

  private Map<String, List<PrsCDData>> prsCDData;

  public PrsData() {
      this.prsCDData = MapUtils.lazyMap(new HashMap<String,List<Object>>(), new Factory() {

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

      });
  }

}
 类似资料:
  • 问题内容: 我以这种方式从表单发送一些参数: 我知道我可以通过添加像这样的参数来获取控制器方法中的所有参数 我想将参数myParam [](而不是其他参数)绑定到列表或数组(任何保持索引顺序的东西),因此我尝试使用以下语法: 和 但是它们都没有绑定myParam。即使将值添加到地图,它也无法绑定参数: 是否有任何语法可以将某些参数绑定到列表或数组,而不必将对象创建为带有列表属性的@ModelAtt

  • 我正在使用Jackson的XML绑定,通过到Java POJO的初始映射,将XML转换为Java列表。我所写的作品,但我不认为我使用杰克逊正确。 这实际上是工作,因为我需要它的工作。我得到了一个Groups类,其中有一个用我期望的元素填充的列表。我在想,方法是正确的吗?我不喜欢我有一个二传手做一个添加,但我所尝试的一切都不起作用。

  • 本文向大家介绍SpringMVC实现数据绑定及表单标签,包括了SpringMVC实现数据绑定及表单标签的使用技巧和注意事项,需要的朋友参考一下 首先理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 但我们提交后,为了将请求信息映射到模型中,还需要手动进行格式转换,此外还借助了一个中转对象productForm,其字段名称和Produ

  • http://some-amazon-link:8080/the-war-name/login 现在我正在纠结如何在Spring MVC项目中添加“/the-war-name/”以及在哪里添加“/the-war-name/”。 它在 null

  • 我想根据ViewBag值过滤下面加载的ProductData dropdownlist,比如ViewBag。类别需要传递给GetProductData()的viewbag值。我怎样才能做到这一点。非常感谢。 控制器: //需要基于viewbag进行过滤。类别值

  • 下面是我的控制器和Init活页夹 这样,我想要的日期格式就不起作用了,这是我得到的输出expenseDate=Wed Mar 18 05:30:00 IST 2015,但我希望它变成一种特定的格式,比如yyyy-MM-dd。。。建议我怎么做。