1、模型
public class Vote { private Integer id; private String title; private Set<VoteItem> voteItems; private VoteSubject voteSubject; } public class VoteItem { private Integer id; private String content; private Vote vote; }
2、控制器
@RequestMapping public String vote(@FormModel("votes") Set<Vote> votes) { System.out.println(votes); return ""; }
@FormModel注解请参考《扩展SpringMVC以支持更精准的数据绑定1》。
当我们在地址栏输入如:http://localhost:9080/es-web/vote?votes[0].voteItems[0].content=123时,会报:
org.springframework.beans.InvalidPropertyException: Invalid property 'voteItems[0]' of bean class [com.sishuok.es.test.Vote]: Cannot get element with index 0 from Set of size 0, accessed using property path 'voteItems[0]'
3、原因:
原因很明显,Set是无序列表,所以我们使用有顺序注入是不太合适的,BeanWrapperImpl实现:
else if (value instanceof Set) { // Apply index to Iterator in case of a Set. Set set = (Set) value; int index = Integer.parseInt(key); if (index < 0 || index >= set.size()) { throw new InvalidPropertyException(getRootClass(), this.nestedPath + propertyName, "Cannot get element with index " + index + " from Set of size " + set.size() + ", accessed using property path '" + propertyName + "'"); } Iterator it = set.iterator(); for (int j = 0; it.hasNext(); j++) { Object elem = it.next(); if (j == index) { value = elem; break; } } }
从实现上可以看出,如果set里边有值,那么就能实现绑定。
4、解决方案:
只要保证在springmvc绑定数据之前,给Set里边加上数据即可:
@ModelAttribute("votes") public Set<Vote> initVotes() { Set<Vote> votes = new HashSet<Vote>(); Vote vote = new Vote(); votes.add(vote); vote.setVoteItems(new HashSet<VoteItem>()); vote.getVoteItems().add(new VoteItem()); return votes; }
这样我们就可以把votes暴露给之前的@FormModel("votes") ,它会使用这个来绑定,所以就有数据了。@ModelAttribute方法请参考《暴露表单引用对象为模型数据》。
但是缺点也很明显,前台必须告诉后台,Set里有几个数据,好让@ModelAttribute方法准备好那么多数据用于数据绑定,比较麻烦。
更简单的解决方案就是使用有序集合,如List,这样最简单。
如上方案通用适用于@ModelAttribute的绑定。
最新的@FormModel的实现请到FormModelMethodArgumentResolver.java下载。
相关推荐
它是一个轻量级的MVC(Model-View-Controller)架构,旨在简化Java Web开发,并提供灵活、可扩展的解决方案。本学习指南将深入探讨SpringMVC的核心概念、配置、以及如何与其他技术如JSTL(JavaServer Pages Standard...
在分布式环境中,Hazelcast可以作为缓存解决方案,也可以作为微服务间的共享数据存储。它支持分布式Map、Queue、Topic、List、Set等多种数据结构,并提供了事件监听、分布式锁、分布式计数器等功能。Hazelcast可以...
### 黑马-springMVC+mybatis:...在实际开发过程中,这两种框架的组合使用极大地提高了开发效率和代码质量,是当前Java Web开发领域中非常流行的解决方案之一。希望读者能够掌握这些知识点,并在自己的项目中灵活运用。
Spring MVC 是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)架构的 Web 应用程序,而 Redis 是一个高性能的键值存储系统,常被用作缓存和数据持久化解决方案。 **Spring MVC 框架** Spring MVC...
Redis Cluster是Redis官方提供的分布式解决方案,它将数据分片到多个节点上,每个节点存储一部分数据,从而实现了水平扩展。Redis Cluster采用了无中心的设计,所有节点彼此通信,共同维护整个集群的状态。 ### 2. ...
通过这样的集成,Spring和CXF可以共同提供强大的Web Service解决方案,同时保持代码的整洁和解耦。这种集成方式使得开发者可以专注于业务逻辑,而无需过多关注底层的通信细节。在实际开发中,还需要注意日志配置、...
Jackson是Java中广泛使用的JSON处理库,用于JSON的序列化和反序列化。它具有活跃的社区支持,频繁的更新,以及高效的性能。...无论是简单的JSON转换,还是复杂的序列化定制,Jackson都能提供相应的解决方案。
SSM(Spring、SpringMVC、MyBatis)是一个常见的Java Web开发框架,它整合了Spring的核心特性、Spring MVC和MyBatis,为开发者提供了一种高效、灵活的后端解决方案。Oracle 11g则是一款广泛使用的商业关系型数据库...
4. **SpringMVC**:作为Spring的Web层解决方案,SpringMVC负责处理HTTP请求和响应。学习SpringMVC,我们需要了解DispatcherServlet、Controller、ModelAndView、视图解析器以及数据绑定等关键组件和流程。 5. **...
5. **SpringCloud面试题**:Spring Cloud为微服务提供了一整套解决方案,面试可能涉及Eureka服务发现、Zuul和Gateway网关、Ribbon客户端负载均衡、Hystrix熔断器、Feign声明式HTTP客户端、Spring Cloud Config配置...
Struts2是一个流行的Java web开发框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在SSH(Struts2、Spring、...尽管SpringMVC提供了更直接的解决方案,但通过上述方式,Struts2同样可以有效地管理多Model请求。
11. SpringBoot/SpringCloud:SpringBoot简化了Spring应用的配置和部署,而SpringCloud则是云环境下微服务架构的一整套解决方案。 12. Hibernate:作为Java对象关系映射工具,Hibernate简化了数据持久化的复杂性,...
- 一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的纯粹的支付平台。 - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统...
- **大数据量访问解决方案**:缓存策略、分库分表、读写分离等。 - **遇到的问题及解决办法**:技术难题、团队合作、时间管理等方面。 - **项目收获**:个人成长、团队协作经验等。 - **构建工具与模块划分**:构建...
- **Hibernate**:全ORM解决方案,自动管理对象的生命周期。 - **MyBatis (原Ibatis)**:半ORM框架,提供动态SQL支持。 - **JDBC**:直接与数据库交互,灵活性高但编码繁琐。 ##### Hibernate的运行原理 - **...