`
bosschen
  • 浏览: 197244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring Web MVC中映射数组及Collection类

 
阅读更多

在开发过程中,遇到需要在页面中映射一个对象,而这个对象中有一个List的属性,于是来CSND问,结果不要说答案,回复的都少得可怜。
于是不得不自己找搜索,中文的,没有发现答案,后来在Spring的官方网站发现答案,特此发文以做纪念。
要映射的对象:

 

class Question{
   private String questionString;
   private int questionId;
   private  List<Option> options = new ArrayList<Option>();
}
class Option{
   private int optionId;
   private String optionString;
}

 jsp代码

 

 

<form:form commandName="surveyQuestion">
  <form:hidden path="questionId"/>
  Question: <form:input path="questionTitle"/>
  <c:forEach items="${surveyQuestion.options}" var="option" varStatus="counter">
    <spring:bind path="surveyQuestion.options[${counter.index}].optionString">
 Option<input type="text" name="<%= status.getExpression() %>" value="<%= status.getValue() %>"<br>
    </spring:bind>
  </c:forEach>
</form:form>

 大致上找到的答案都是这样说,这样的写法也的确可以保证页面正确显示form及数据,但是当点击提交按钮时却出现

 


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

没有办法只好再次去查找,终于找到,有人在论坛(非CSDN论坛)说道,需要在Question的默认的constructor中加入以下语句:
options = ListUtils.lazyList(new ArrayList<Option>(),FactoryUtils.instantiateFactory(Option.class));
应该是Spring在初始化的时候存在一些问题。没有时间看源代码。再次提交,成功了!


后来发现,还是存在一点儿问题,就是当对一个已存在的Question添加Option时仍会出现同样的问题,解决方案请继续看。

 

在上文中我提到了在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对象。

分享到:
评论

相关推荐

    使用 Spring 2.5 基于注解驱动的 Spring MVC

    传统的Spring MVC应用程序通常需要在XML配置文件中进行大量的手动配置,包括定义各种Bean、配置请求映射等。这种方式虽然有效,但相对繁琐且不易维护。相比之下,注解驱动的方式更为简洁明快,极大地提高了开发效率...

    spring mvc 项目错误,和一些配置

    在Spring MVC web中找不到静态的资源 - **原因**:这通常是由于静态资源的路径配置不正确导致的。 - **解决办法**: - 确认`spring.mvc.static-path-pattern`和`spring.resources.static-locations`属性是否已正确...

    springMVC整合MongoDb整个工程下载

    6. **实体类设计**:MongoDB 支持 JSON 格式的文档存储,因此在 Spring MVC 中,我们通常会创建对应的 Java 类来映射 MongoDB 中的文档。例如,创建一个 `User` 类,包含姓名、邮箱等字段,并使用 `@Document` 注解...

    springmybatis

    sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 &lt;typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/&gt; 这个别名非常重要,你在 具体的类的映射中,比如User...

    Mybatis关系映射

    Mybatis 是一款流行的轻量级持久层框架,它与Spring MVC 集成后能方便地处理数据库操作,包括各种复杂的数据关系映射。在Java Web开发中,数据关系映射是必不可少的一部分,它帮助我们将数据库中的表结构映射到对象...

    ssm整合以及关系映射完整项目

    SSM整合指的是Spring、Spring MVC和MyBatis三个开源框架的集成,这在Java Web开发中是非常常见的一种组合。这个项目“ssm_integration_with_relationship_mapping”显然是为了帮助初学者掌握如何将这三个框架协同...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    我们可以在父表(如用户表)的映射文件中定义一个collection元素,指定关联的子表(如订单表)以及关联条件。在Java代码中,通过MyBatis的SqlSession对象加载或保存相关的对象,Ibatis会自动处理一对多的关联填充和...

    Spring_3[1].0注解开发的简单例子(@Service)_-.txt

    在提供的部分代码示例中,我们可以看到一个简单的Spring MVC Controller的实现——`BbtForumController`类。 ```java package com.baobaotao.web; import com.baobaotao.service.BbtForumService; import org....

    JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)习题(2022).pdf

    16. Spring MVC 的配置文件:Spring MVC 的配置文件中,可以配置处理器映射、处理器映射器、处理器适配器和视图解析器。 17. Spring MVC 的前端控制器:Spring MVC 提供了一个前端控制器 DispatcherServlet,使开发...

    spring 整合mongodb

    在IT行业中,Spring框架是Java开发中的重要工具,而MongoDB则是一种流行的NoSQL数据库,以其灵活性和高性能著称。本文将深入探讨如何整合Spring框架与MongoDB,以实现高效的数据存储和检索。 首先,Spring Data ...

    基于 MongoDB 及 Spring Boot 的文件服务器的实现

    在现代Web应用开发中,构建一个文件服务器是常见的需求,特别是在大数据存储和处理场景下。本项目基于MongoDB数据库和Spring Boot框架实现了一个文件服务器,旨在提供高效、可靠的文件存储和检索服务。以下将详细...

    有关spring的一些学习总结

    在文件"java_collection_类比较.pdf"中,可能会详细讲解Java集合框架的各种类,如ArrayList、LinkedList、HashSet、HashMap等的区别和使用场景,这对于理解Spring中如何管理和操作数据非常重要。 "itbities.txt...

    Collection,List,Set和_Map用法和区别

    在 Java 中,集合类的使用非常广泛,例如在 Spring MVC 框架中,集合类被广泛应用于数据处理和存储。在实际开发中,需要根据实际情况选择合适的集合类,并正确地使用集合类来实现业务逻辑。 Collection、List、Set ...

    backbone+bootstrap+ibatis+spring例子

    它提供了Model、View、Collection和Router等核心概念,帮助开发者更好地组织和管理前端数据及视图逻辑。在TodoList项目中,Backbone.js可能被用来创建Todo模型来存储任务信息,定义TodoView来渲染和交互UI,以及设置...

    框架经典面试题分享.pdf

    5. Spring Web MVC中的数据绑定、表单验证和国际化。 6. Spring中常见的类和接口,如Resource、BeanDefinition、BeanWrapper、ApplicationContext等。 7. Spring与JDBC、ORM、JPA和Hibernate的集成。 8. Spring的...

    最新Struts和Hibernate和Spring经典面试题

    Struts 的优点是提供了一个基于 MVC 模式的框架,能够简化 Web 应用程序的开发,提高开发效率和代码重用率。 Spring 1. Spring 工作机制? Spring 的工作机制包括 IoC 容器、AOP 代理、依赖注入、事务管理等。 2...

    struts2+mybatis+spring整合

    Struts2、MyBatis和Spring的整合是Java Web开发中常见的技术栈,通常被称为SSM框架。这个组合提供了模型-视图-控制器(MVC)架构的支持,数据持久层的处理以及依赖注入的能力,使得开发者能够高效地构建可维护、可...

    基于ssm+mysql环卫管理平台源码数据库.zip

    SSM框架是Java Web开发中常用的一种整合框架,由Spring、Spring MVC和MyBatis三个开源框架组成。这个环卫管理平台的源码数据库就是基于这一技术栈构建的,让我们来深入了解一下这三个组件。 1. **Spring框架**:...

    ssm 一对一 一对多demo

    SSM(Spring、Spring MVC、MyBatis)是一套经典的Java Web开发框架,它整合了Spring的IoC容器、Spring MVC的MVC框架以及MyBatis的持久层框架。在这个"ssm 一对一 一对多demo"项目中,我们将探讨如何在SSM环境中实现...

    java面试题.docx

    Java 是一门广泛应用的编程语言,它的面试题涵盖了 Java 基础、Java 集合、多线程、Java 异常、Spring、Spring MVC、Spring Boot、Spring Cloud、Netty、Dubbo、Activemq、Java Web、JVM、Kafka、MongoDB、MyBatis、...

Global site tag (gtag.js) - Google Analytics