`
jinnianshilongnian
  • 浏览: 21513640 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2420447
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3010220
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5640568
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:260217
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597925
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250368
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5860558
Group-logo
跟我学Nginx+Lua开...
浏览量:702867
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785734
社区版块
存档分类
最新评论

springmvc绑定Set的解决方案

阅读更多

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下载。

 

 

相关文章:

扩展SpringMVC以支持更精准的数据绑定1

SpringMVC内置的精准数据绑定2 

1
2
分享到:
评论
3 楼 15882967370 2016-09-01  
  学习啦 大神
2 楼 jinnianshilongnian 2013-06-21  
asialee 写道
lz分析问题的精神值得佩服!

,对于自己熟悉的领域,就想把问题整明白,整不明白心里走放不下。估计这就是兴趣吧,哈哈。
1 楼 asialee 2013-06-21  
lz分析问题的精神值得佩服!

相关推荐

    SpringMVC学习指南

    它是一个轻量级的MVC(Model-View-Controller)架构,旨在简化Java Web开发,并提供灵活、可扩展的解决方案。本学习指南将深入探讨SpringMVC的核心概念、配置、以及如何与其他技术如JSTL(JavaServer Pages Standard...

    springmvc+mybatis+Hazelcast试验

    在分布式环境中,Hazelcast可以作为缓存解决方案,也可以作为微服务间的共享数据存储。它支持分布式Map、Queue、Topic、List、Set等多种数据结构,并提供了事件监听、分布式锁、分布式计数器等功能。Hazelcast可以...

    黑马-springMVC+mybatis

    ### 黑马-springMVC+mybatis:...在实际开发过程中,这两种框架的组合使用极大地提高了开发效率和代码质量,是当前Java Web开发领域中非常流行的解决方案之一。希望读者能够掌握这些知识点,并在自己的项目中灵活运用。

    springmvc框架+redis

    Spring MVC 是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)架构的 Web 应用程序,而 Redis 是一个高性能的键值存储系统,常被用作缓存和数据持久化解决方案。 **Spring MVC 框架** Spring MVC...

    RedisCluster集群(Spring访问Redis)

    Redis Cluster是Redis官方提供的分布式解决方案,它将数据分片到多个节点上,每个节点存储一部分数据,从而实现了水平扩展。Redis Cluster采用了无中心的设计,所有节点彼此通信,共同维护整个集群的状态。 ### 2. ...

    spring CXF集成,实现webservice(包含https)

    通过这样的集成,Spring和CXF可以共同提供强大的Web Service解决方案,同时保持代码的整洁和解耦。这种集成方式使得开发者可以专注于业务逻辑,而无需过多关注底层的通信细节。在实际开发中,还需要注意日志配置、...

    Java之Jackson的基本使用案例讲解.pdf

    Jackson是Java中广泛使用的JSON处理库,用于JSON的序列化和反序列化。它具有活跃的社区支持,频繁的更新,以及高效的性能。...无论是简单的JSON转换,还是复杂的序列化定制,Jackson都能提供相应的解决方案。

    ssm+oracle11g的增删改查

    SSM(Spring、SpringMVC、MyBatis)是一个常见的Java Web开发框架,它整合了Spring的核心特性、Spring MVC和MyBatis,为开发者提供了一种高效、灵活的后端解决方案。Oracle 11g则是一款广泛使用的商业关系型数据库...

    Spring从入门到精通

    4. **SpringMVC**:作为Spring的Web层解决方案,SpringMVC负责处理HTTP请求和响应。学习SpringMVC,我们需要了解DispatcherServlet、Controller、ModelAndView、视图解析器以及数据绑定等关键组件和流程。 5. **...

    2024 Java面试宝典合集

    5. **SpringCloud面试题**:Spring Cloud为微服务提供了一整套解决方案,面试可能涉及Eureka服务发现、Zuul和Gateway网关、Ribbon客户端负载均衡、Hystrix熔断器、Feign声明式HTTP客户端、Spring Cloud Config配置...

    SSH框架网上商城项目第24战之Struts2中处理多个Model请求的方法

    Struts2是一个流行的Java web开发框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在SSH(Struts2、Spring、...尽管SpringMVC提供了更直接的解决方案,但通过上述方式,Struts2同样可以有效地管理多Model请求。

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    11. SpringBoot/SpringCloud:SpringBoot简化了Spring应用的配置和部署,而SpringCloud则是云环境下微服务架构的一整套解决方案。 12. Hibernate:作为Java对象关系映射工具,Hibernate简化了数据持久化的复杂性,...

    单点登录源码

    - 一站式支付解决方案,统一下单接口,支持支付宝、微信、网银等多种支付方式。不涉及业务的纯粹的支付平台。 - 统一下单(统一下单接口、统一扫码)、订单管理、数据分析、财务报表、商户管理、渠道管理、对账系统...

    黑马面试宝典知识点复习

    - **大数据量访问解决方案**:缓存策略、分库分表、读写分离等。 - **遇到的问题及解决办法**:技术难题、团队合作、时间管理等方面。 - **项目收获**:个人成长、团队协作经验等。 - **构建工具与模块划分**:构建...

    java面试知识

    - **Hibernate**:全ORM解决方案,自动管理对象的生命周期。 - **MyBatis (原Ibatis)**:半ORM框架,提供动态SQL支持。 - **JDBC**:直接与数据库交互,灵活性高但编码繁琐。 ##### Hibernate的运行原理 - **...

Global site tag (gtag.js) - Google Analytics