项目记事【SpringMVC-1】:后台接收前端传来的JSON,并转成对象
背景:
最近项目中使用SpringMVC,需要从前端接收JSON格式的请求,在后端自动转成一个与JSON格式相同的对象。
由于是一个老项目,Spring的版本是3.2.7。
问题:POST or GET
这个请求,是一个计算类型的请求,不涉及数据的修改,从意义上来说的角度应该是一个 GET 请求。
但是请求报文设计时要求高度的灵活性,传递的属性都是以 kind-value 形式,如:
{
"kind":"premium",
"value":"1000"
}
而不是传统的模式:
{
"premium":"1000"
}
所以报文的长度会显得非常的长。
以下是最初的后端 Controller 设计:
@Controller
@RequestMapping(value = "/PMS/Groovy")
public class GetGroovyValueController { @RequestMapping(value = "/Discount", method = RequestMethod.POST)
@ResponseBody
public ResponseVO<String> getDiscount(LiabilityVO liabilityVO) {
// 具体代码不详述了
}
}
Controller
会出现一个和特殊的情况:
1. GET 请求接收的报文长度,根据浏览器的不同,是有限制的,而客户要求的 IE 浏览器所支持的长度有限。
2. 报文传递的 JSON 格式,与 LiabilityVO 这个模型是匹配的,但是数据并不能完整的传递到后台。(这种情况在使用第二种JSON格式的时候不会出现)
针对以上2个情况,研究出的解决方案如下:
1. 改用 POST 请求,这么做虽然与设计的意义有些违背,在安全性上考虑也略显欠缺,但是这是目前想到的最佳解决方案,在不改变模型的情况下。
2. 分别作出如下修改:
- AJAX 请求格式,增加 contentType: "application/json"。
- webmvc-config.xml 文件中 MappingJackson2HttpMessageConverter 的配置。
- Controller 中参数增加 @RequestBody注解。
话不多说,直接上代码:
@Controller
@RequestMapping(value = "/PMS/Groovy")
public class GetGroovyValueController { @RequestMapping(value = "/Discount", method = RequestMethod.POST)
@ResponseBody
public ResponseVO<String> getDiscount(@RequestBody LiabilityVO liabilityVO) {
// 具体代码不详述了
}
}
Controller
<property name="messageConverters">
<list>
<bean id="utf8StringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!-- 解决 HttpMediaTypeNotAcceptableException: Could not find acceptable representation -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<!-- 以下2个是新增的 -->
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
webmvc-config.xml
$.ajax({
type: 'POST',
url: "${pageContext.request.contextPath}/PMS/Groovy/Discount.jspx",
data: JSON.stringify(str),
dataType: 'json',
contentType: "application/json",
cache: false,
success: function (res) { },
error: function (data) {
alert('失败');
}
});
AJAX
Over,问题解决!
项目记事【SpringMVC-1】:后台接收前端传来的JSON,并转成对象的更多相关文章
- SpringMVC中@RequestBody接收前端传来的多个参数
在使用ajax发送请求时,如果发送的JSON数据是一个类中的不同属性,在Controller方法中使用@RequestBody会直接封装进该类中 例如: 前端部分代码 JavaScript <s ...
- java后台解析前端传来的json
@RequestMapping(value = {"save"}) @ResponseBody public Result save(TBaseInterventionPlan m ...
- Java如何接收前端传来的多层嵌套的复杂json串
想看问题直接解决方式,直接拉到博文底部. Spring的controller在接收前端传参的时候如果参数使用@RequestBody标注的时候 @RequestBody 则会把前端参数转为JSON的形 ...
- WEB项目 后台接收前端数组
//保存区域选择的设备 $scope.saveDevice = function(){ var device = []; $("input[type='checkbox']:checked& ...
- java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限. 按钮权限: 给角色分配按钮权限.2 ...
- java后端接收前端传来的复杂对象(包含List对象集合)
最近在和安卓对接口的时候发现往java后端传数据的时候,后台对象无法接收. 说明:后台对象为 类似结构 ObjectA{ private String a; private String b; pr ...
- SpringMVC的控制器接收前端数据的方式
1.请求处理方法中可以出现以下几种参数类型,直接在controller方法形参上定义默认类型的对象,就可以使用这些对象.可以通过下列对象来获取前台传来的参数: ①HttpServletRequest对 ...
- SpringMVC 通过post接收form参数或者json参数
springmvc的controller很多都用来提供restful服务,成为多功能action 同一个接口既能够提供给web端,也可以提供给ios以及安卓 @RequestBody 可以把接收到的j ...
- c#将前端传来的Json解析成对象
描述:因工作中需要将C#中的Json字符串转换为对象,对此记录下. 解决办法: 1.前端传过来的Json字符串,OrderAppModuleJson即前端传递到后端的Json字符串 string st ...
随机推荐
- java constructor 在构造子类时,一定会调用到父类的构造方法 “ 私有属性被继承了?”问题
” Error:Implicit super constructor Pet() is undefined. Must explicitly invoke another constructor “ ...
- springBoot基础系列--properties配置
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7183408.html SpringBoot中免除了大部分手动配置,但是对于一些特定的情况, ...
- UltraEdit MAC破解方法
在终端输入 printf '\x31\xC0\xFF\xC0\xC3\x90' | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/U ...
- CentOS7的网卡启动不起来的问题
这个问题在刚学Linux遇到的,centOS7的网卡启动不起来,导致建不了集群.如下图没有ifconf-env33网卡的IP 还有下面这个图>>> 如果你遇到了,呵呵呵,迷之微笑. ...
- java定时任务的实现方式
在本文里,我会给大家介绍2种不同的实现方法:1.普通thread实现2.ScheduledExecutorService实现 一:实现普通的thread: 首先是创建thread然后就是一直让whil ...
- promise异步编程的原理
一.起源 JavaScript中的异步由来已久,不论是定时函数,事件处理函数还是ajax异步加载都是异步编程的一种形式,我们现在以nodejs中异步读取文件为例来编写一个传统意义的异步函数: var ...
- Python基础之常用模块(二)
一.sys模块 1.sys.exit() 退出程序,这是正常退出程序,与之前用的break不同的是,break只是退出循环,循环之后的代码还会正常运行 2.sys.argv 会返回一个列表,列表中的 ...
- 消息中间件Client模块划分
上图是之间讨论确定的系统架构(后续内容会按照这个架构来叙述),其中: 客户端包含Producer和Consumer两大块 客户端需要和NameServer交互来获取元数据 客户端需要和Broker交互 ...
- java文件上传Demo
说到文件上传我们要做到: 1.引入两个包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 2.将form改为上传文件模式:enctype=" ...
- Hadoop的配置过程(虚拟机中的伪分布模式)
1引言 hadoop如今已经成为大数据处理中不可缺少的关键技术,在如今大数据爆炸的时代,hadoop给我们处理海量数据提供了强有力的技术支撑.因此,了解hadoop的原理与应用方法是必要的技术知识. ...