spring MVC中传递的参数对象中包含list的情况
测试需要的jar包:spring 3.2.jar + jackson-all-1.8.5.jar。
写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过来,贴下代码:
controller:
@RequestMapping(params="save")
@ResponseBody
public CustomForeignKey save(@RequestBody CustomForeignKey customForeignKey,Model model,ModelAndView mv,HttpServletRequest req){
return customForeignKeyService.add(customForeignKey);
}
参数对象:
public class CustomForeignKey {
private Long id;
private Long tableId;
private Long foreignKeyTableId;
private String foreignKeyTableName;
private String name;
private List<CustomForeignKeyRelation> customForeignKeyRelations; public Long getId() {
return id;
}
对象下子明细:CustomForeignKeyRelation :
public class CustomForeignKeyRelation {
private Long id;
private Long customForeignKeyId;
private Long leftCustomColumnId;
private String leftCustomColumnName;
private String leftCustomColumnAlias;
private Long rightCustomColumnId;
private String rightCustomColumnName;
private String rightCustomColumnAlias; public Long getId() {
return id;
}
js传递的代码段:
var relations = [];
$.each(rows,function(i,obj){
if(obj.leftCustomColumnId != 0 && obj.leftCustomColumnName && obj.leftCustomColumnName != '无')
relations.push({leftCustomColumnId:obj.leftCustomColumnId,
leftCustomColumnName:obj.leftCustomColumnName,
rightCustomColumnId:obj.rightCustomColumnId,
rightCustomColumnName:obj.rightCustomColumnName});
}) var dd = {tableId:selectRowOfTable.id,
name:t_fk_name,
foreignKeyTableId:$("#foreignKeyDialog_foreignTableId").combobox("getValue"),
foreignKeyTableName:$("#foreignKeyDialog_foreignTableId").combobox("getText"),
customForeignKeyRelations:relations
};
/*$.post("customForeignKey.htm?add",dd,function(){
dgForeignKey.datagrid("reload");
foreignKeyDialog.dialog("close");
});*/
$.ajax({
url:"customForeignKey.htm?add",
type:"post",
dataType:"json",
contentType:"application/json",
data:JSON.stringify(dd),
success:function(){
alert("success");
}
});
按照网上所说,我将 ajax的 contentType:"application/json",将json对象改成json字符,在参数前面加上@RequestBody,可是传递到add方法里之后,却发现还是个空,不仅里面的list没值,连那些 long、String类型的也都没有值,后经过几个小时的研究发现,原来是配置spring 的json的类型里少写了“application/json;charset=UTF-8”,导致没有应用到json的类型转换。
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
加上这个之后就ok了。
现在总结一下 springMVC传递参数的的方法。
1.ajax: 传递的参数请求头里 Context-Type 的问题,我们若是用$.post的话,它默认是为application/x-www-from-urlencoded;charset=utf-8,网上说要改为“application/json”才能转换,实际上你改成其他的也行,只要在xml的配置文件里包含它,那么它将会在转换时会采用json包下的 MappingJacksonHttpMessageConverter类进行转换;网上有人说spring只支持简单类型的数组转换,我想就是因为他们没有配置MappingJacksonHttpMessageConverter类的使用,MappingJacksonHttpMessageConverter不属于spring。
2.参数:平常我们使用访问时,是直接将json对象传递给后台,而当我们的对象里包括数组时,就不能使用json对象,在jQuery里,post里的json对象会转换成url参数模式传递,里面的对象的[、]、.也会被转换成其他%%之类的,这种情况下spring 会将它们当做简单的key=value值进行转换,是不会进入到MappingJacksonHttpMessageConverter类中, 此时转换时会报错, 说 customForeignKeyRelations[0].id 没有对应属性,它们将 customForeignKeyRelations[0].id当成一个属性来转换;按照MappingJacksonHttpMessageConverter的要求,我们需要将json对象改为字符串传递,可以使用 JSON.stringify(jsonData)方法将json对象转换成字符串(该方法在ie低级版本里没有),此时我们在request的参数里可以看到它与我们平常传递的参数的不同。
太啰嗦了,简单点:
1.定义Context-Typeapplication/json;charset=utf-8: ajax传递参数里更改,spring配置文件里 添加;
2.json对象传递时,改为字符串,通用方法为JSON.stringify(jsonData);
3.接收字符串对象:在参数前加 @RequestBody
spring MVC中传递的参数对象中包含list的情况的更多相关文章
- spring mvc 如何传递集合参数(list,数组)
spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...
- Spring MVC(七)--传递JSON参数
有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...
- 关于HTTP请求中更改body中传递的参数方法
更改body中传递的参数方法: String txId = UUID.randomUUID().toString().replaceAll("-", ""); ...
- js的url中传递中文参数乱码,如何获取url中参数问题
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript ...
- Js的Url中传递中文参数乱码的解决
一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url& ...
- linux中probe函数中传递的参数来源(上)
点击打开链接 上一篇中,我们追踪了probe函数在何时调用,知道了满足什么条件会调用probe函数,但probe函数中传递的参数我们并不知道在何时定义,到底是谁定义的,反正不是我们在驱动中定义的(当然 ...
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- Spring MVC之Action输入参数
第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ...
- Spring MVC 接受的请求参数
目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...
随机推荐
- css样式小技巧
1.css样式小技巧 HTML怎样设定使背景图片不随页面滚动而滚动 background-attachment:fixed; 2.实现li a 超过长度内容出现省略号… overflow:hidden ...
- WebStorm 之 Cordova 环境搭建
一.环境搭建 Cordova 环境配置之前,应先下载安装 Node.js ,中文官网:http://nodejs.cn/. 以管理员身份运行 cmd 命令行工具: 1.查看 Node.js 是否已安装 ...
- Java BIO、NIO、AIO 学习
正在学习<大型网站系统与JAVA中间件实践>,发现对BIO.NIO.AIO的概念很模糊,写一篇博客记录下来.先来说个银行取款的例子: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO ...
- Python学习笔记_04:Django框架简介
目录 1 什么是Django? 2 Django框架的开发环境搭建 3 Django操作MySql数据库简介 4 功能强大的Django管理工具应用 1 什么是Django? Django是应用于We ...
- 算法笔记_230:运动员分组(Java)
目录 1 问题描述 2 解决方案 1 问题描述 有N个人参加100米短跑比赛.跑道为8条.程序的任务是按照尽量使每组的人数相差最少的原则分组.例如:N=8时,分成1组即可.N=9时,分成2组:一组 ...
- 用python解析pdf中的文本与表格【pdfplumber的安装与使用】
我们接触到的很多文档资料都是以pdf格式存在的,比如:论文,技术文档,标准文件,书籍等.pdf格式使得用机器从中提取信息格外困难. 为了解决这个问题,我找到了几种解决方案,最后选择了python上的p ...
- 深入理解JVM内存区域与内存分配
前言:这是一篇关于JVM内存区域的文章,由网上一些有关这方面的文章和<深入理解Java虚拟机>整理而来,所以会有些类同的地方,也不能保证我自己写的比其他网上的和书本上的要好,也不可能会这样 ...
- Qt 使用 net-snmp 包的过程记录
使用 C/C++ 进行 SNMP 开发,网上比较流行的主要是用 net-snmp 和 snmp++ .在 sourceforge 上以 Qt 和 snmp 为关键词进行搜索,搜到的项目 net-snm ...
- Python文本爬虫实战
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7019950.html 一:流程 目标:爬取目标网页的图片 1:获取网页源码 2:用Python读取源码 3: ...
- Axis 发布、调用WebService(转)
一.JWS方法发布WebService 1.在官方网站下载axis的工程(这个等下就有用的)和源码.jar包等,下载地址是: http://www.apache.org/dyn/closer.cgi/ ...