Spring Web MVC中映射数组及Collection类(二)

原创 2007年10月26日 15:44:00
Spring Web MVC中映射数组及Collection类

在上文中我提到了在command对象的构造器中添加:options = ListUtils.lazyList(new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class));来解决org.springframework.beans.InvalidPropertyException: Invalid property 'options[0]' of bean class [Question]: Index of out of bounds in property path 'options[0]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 0, Size: 0的问题,但是在开发过程中发现,仍存在着问题。

使用上面的方法,当这个Question对象是第一次录入的时候就没有问题,更改Option也没有问题,但是如果用户增加Question中的option的数目时,还会遇到上面的问题,当然,这个时候不是index:0, size: 0,而是index是question中线有的options的数目。

从网上找了很久,没有答案,迫不得已去看Spring的源代码,发现Spring在绑定对象的时候,先从Cache中拿出原来的对象,并且根据现在提供的数据,一次拿出原数据,显而易见问题就出在这里,因为原来Question中只有5个option,现在用户添加了一个,那么当Spring去找第6个Option时,肯定会出现我们上面遇到的问题。因为仅仅读了关于绑定这一部分代码,所以我不想更改Spring。

那么我们重新把注意力放在构造器的更改上面,既然通过增加一行代码可以让新的Question对象正确地去的数据,那么完全可以把这一行代码添加到getOptions方法中,这样一来,在每次取得options这个List时,都对他进行的Lazy处理。

准备改的时候,想到,添加这一行代码仅仅是为了Spring的应用,那么如果当我们把这一部分换成Struts或者其他框架的时候,这一行代码显然是多余的,那么反而不如在Spring的controller里面进行处理。

修改Controller,哈哈哈,工作了。
        Question question = ....//getQuestion;
        if(question==null)...{
            Question 
= new Question();
            question.setOptions(ListUtils.lazyList(
new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class)));
        }
else...{
            question.setOptions(ListUtils.lazyList(question.getOptions(),FactoryUtils.instantiateFactory(Option.
class)));
        }

可以看到,在else里面使用的是question中已经拿到的option,而不是新建一个ArrayList对象。


版权所有: idilent 网站转载请注明作者并链接到http://blog.csdn.net/idilent,
其他转载方式请与作者联系(idilent@yahoo.com.cn)。

Spring Web MVC中映射数组及Collection类

一直觉得CSDN是国内最大的技术论坛,其中也有不好的高手,但是从学习Hibernate开始,慢慢发现,大的确是大,但是却真得不够精。很多问题都是问一些怎么配置呀,怎么调试呀;要么就是一些钻牛角尖的问题...
  • idilent
  • idilent
  • 2007年09月25日 16:39
  • 5313

Spring中Mongodb的java实体类映射

spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的。它可以通过注释把java类转换为mongodb的文档。 它有以下几种注释: @I...
  • u010084868
  • u010084868
  • 2016年09月22日 14:21
  • 5213

mybatis collection 高级映射出错问题解决

问题:mybatis collection高级映射(不使用子查询,避免N+1),mapper配置如下: resultMap id="OmsSkuPoMap" type="com.tr...
  • shandalue
  • shandalue
  • 2016年03月14日 00:43
  • 2979

SpringMVC映射请求参数的方式(参数绑定方式)

SpringMVC通过分析处理方法的签名,可以将HTTP请求信息绑定到处理方法的相应参数中。使用@RequestParam绑定请求参数值  在处理方法参数处使用@RequestParam可以把请求参数...
  • xiangwanpeng
  • xiangwanpeng
  • 2016年11月06日 12:50
  • 3882

基于Spring注解的WEB MVC开发,URL映射

使用过低版本 Spring MVC 的读者都知道:当创建一个 Controller 时,我们需要直接或间接地实现 org.springframework.web.servlet.mvc.Control...
  • shutingwang
  • shutingwang
  • 2011年08月04日 15:09
  • 10036

自定义WEB MVC框架 二 简单扫描和映射绑定

主控制器-第二版  上一篇简单的定下一个结构,这次要把它完善起来,至少能跑通。   首先假定所有的Controller类(请求处理器,如果是很古老的写法,那么应该是每一个Servlet)都在一个指定...
  • o983950935
  • o983950935
  • 2017年04月06日 16:24
  • 310

Spring MVC系列(二)之@RequestMapping和URL映射

@RequestMapping是一个用来处理请求地址映射的注解,可以注解与类上,也可以注解与类中的方法上,注解与类上,表示该Controller的统一标识,通常表示一个模块的表示,注解在方法,则表示某...
  • linuu
  • linuu
  • 2016年03月31日 09:40
  • 2499

Spring Web MVC项目搭建(二)Swagger搭建

Maven引入swagger相关jar包 com.mangofactory swagger-springmvc 1.0.2 2.创建config类package com.lo...
  • qq_22650745
  • qq_22650745
  • 2017年07月07日 00:14
  • 97

Spring 4 官方文档学习(②)Web MVC 框架之编码式Servlet容器初始化

Part III. 核心技术-7. IOC容器-7.12 基于Java的容器配置
  • dreamsunday
  • dreamsunday
  • 2017年06月05日 13:12
  • 644

Spring Web MVC框架(二) 控制器

在前面我们搭建了基本的Spring Web MVC环境,并配置了一个控制器。下面我们来详细学习一下控制器。控制器的主要作用就是处理特定URL发过来的HTTP请求,然后进行业务逻辑处理,将结果返回给某个...
  • u011054333
  • u011054333
  • 2017年02月06日 19:24
  • 166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Web MVC中映射数组及Collection类(二)
举报原因:
原因补充:

(最多只允许输入30个字)