背景:

最近项目中使用SpringMVC,需要从前端接收JSON格式的请求,在后端自动转成一个与JSON格式相同的对象。

由于是一个老项目,Spring的版本是3.2.7。

问题:POST or GET

这个请求,是一个计算类型的请求,不涉及数据的修改,从意义上来说的角度应该是一个 GET 请求。

但是请求报文设计时要求高度的灵活性,传递的属性都是以 kind-value 形式,如:

{
    "kind":"premium",
    "value":"1000"
}

而不是传统的模式:

{
    "premium":"1000"
}

所以报文的长度会显得非常的长。

以下是最初的后端 Controller 设计:

  1. @Controller
  2. @RequestMapping(value = "/PMS/Groovy")
  3. public class GetGroovyValueController {
  4.  
  5. @RequestMapping(value = "/Discount", method = RequestMethod.POST)
  6. @ResponseBody
  7. public ResponseVO<String> getDiscount(LiabilityVO liabilityVO) {
  8. // 具体代码不详述了
  9. }
  10. }

Controller

会出现一个和特殊的情况:

1. GET 请求接收的报文长度,根据浏览器的不同,是有限制的,而客户要求的 IE 浏览器所支持的长度有限。

2. 报文传递的 JSON 格式,与  LiabilityVO 这个模型是匹配的,但是数据并不能完整的传递到后台。(这种情况在使用第二种JSON格式的时候不会出现)

针对以上2个情况,研究出的解决方案如下:

1. 改用 POST 请求,这么做虽然与设计的意义有些违背,在安全性上考虑也略显欠缺,但是这是目前想到的最佳解决方案,在不改变模型的情况下。

2. 分别作出如下修改:

  • AJAX 请求格式,增加 contentType: "application/json"。
  • webmvc-config.xml 文件中 MappingJackson2HttpMessageConverter 的配置。
  • Controller 中参数增加 @RequestBody注解。

话不多说,直接上代码:

  1. @Controller
  2. @RequestMapping(value = "/PMS/Groovy")
  3. public class GetGroovyValueController {
  4.  
  5. @RequestMapping(value = "/Discount", method = RequestMethod.POST)
  6. @ResponseBody
  7. public ResponseVO<String> getDiscount(@RequestBody LiabilityVO liabilityVO) {
  8. // 具体代码不详述了
  9. }
  10. }

Controller

  1. <property name="messageConverters">
  2. <list>
  3. <bean id="utf8StringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
  4. <property name="supportedMediaTypes">
  5. <list>
  6. <value>text/plain;charset=UTF-8</value>
  7. </list>
  8. </property>
  9. </bean>
  10. <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  11. <!-- 解决 HttpMediaTypeNotAcceptableException: Could not find acceptable representation -->
  12. <property name="supportedMediaTypes">
  13. <list>
  14. <value>text/html;charset=UTF-8</value>
  15. <!-- 以下2个是新增的 -->
  16. <value>application/x-www-form-urlencoded;charset=UTF-8</value>
  17. <value>application/json;charset=UTF-8</value>
  18. </list>
  19. </property>
  20. </bean>
  21. </list>
  22. </property>

webmvc-config.xml

  1. $.ajax({
  2. type: 'POST',
  3. url: "${pageContext.request.contextPath}/PMS/Groovy/Discount.jspx",
  4. data: JSON.stringify(str),
  5. dataType: 'json',
  6. contentType: "application/json",
  7. cache: false,
  8. success: function (res) {
  9.  
  10. },
  11. error: function (data) {
  12. alert('失败');
  13. }
  14. });

AJAX

Over,问题解决!

项目记事【SpringMVC-1】:后台接收前端传来的JSON,并转成对象的更多相关文章

  1. SpringMVC中@RequestBody接收前端传来的多个参数

    在使用ajax发送请求时,如果发送的JSON数据是一个类中的不同属性,在Controller方法中使用@RequestBody会直接封装进该类中 例如: 前端部分代码 JavaScript <s ...

  2. java后台解析前端传来的json

    @RequestMapping(value = {"save"}) @ResponseBody public Result save(TBaseInterventionPlan m ...

  3. Java如何接收前端传来的多层嵌套的复杂json串

    想看问题直接解决方式,直接拉到博文底部. Spring的controller在接收前端传参的时候如果参数使用@RequestBody标注的时候 @RequestBody 则会把前端参数转为JSON的形 ...

  4. WEB项目 后台接收前端数组

    //保存区域选择的设备 $scope.saveDevice = function(){ var device = []; $("input[type='checkbox']:checked& ...

  5. java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码

    .   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限      角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限.      按钮权限: 给角色分配按钮权限.2 ...

  6. java后端接收前端传来的复杂对象(包含List对象集合)

    最近在和安卓对接口的时候发现往java后端传数据的时候,后台对象无法接收. 说明:后台对象为 类似结构 ObjectA{ private String  a; private String b; pr ...

  7. SpringMVC的控制器接收前端数据的方式

    1.请求处理方法中可以出现以下几种参数类型,直接在controller方法形参上定义默认类型的对象,就可以使用这些对象.可以通过下列对象来获取前台传来的参数: ①HttpServletRequest对 ...

  8. SpringMVC 通过post接收form参数或者json参数

    springmvc的controller很多都用来提供restful服务,成为多功能action 同一个接口既能够提供给web端,也可以提供给ios以及安卓 @RequestBody 可以把接收到的j ...

  9. c#将前端传来的Json解析成对象

    描述:因工作中需要将C#中的Json字符串转换为对象,对此记录下. 解决办法: 1.前端传过来的Json字符串,OrderAppModuleJson即前端传递到后端的Json字符串 string st ...

随机推荐

  1. java 网络编程 UDP TCP

    网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: ...

  2. maven 打包时mapper.xml打不进去问题

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  3. Socket通信中的 BeginReceive与EndReceive

    BeginReceive 与endReceive 必须成对出现,如果BeginReceive没有及时调用endReceive,可能会出现数据被从buffer中读取二次,如果在下面这行代码下面加入别的代 ...

  4. MySQL主从复制的实现过程

    一.什么是主从复制 将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数据库保持一致. 二.主从复制的作用 1. ...

  5. 使用random输出10个double型的随机数

    使用random输出10个double型的随机数 代码如下: package Day05;import java.util.Random;import java.util.Scanner; publi ...

  6. docker~大叔对术语的解释

    回到目录 接触和使用docker已经有1年多了,起初对概念本身理解的不是很好,或者说,没有找到一本比较好的书,在自己的研究下,对docker一些基本的概念有了自己的一些认识和看法,现在分享给正在学习d ...

  7. python web开发之django

    上一篇介绍了python-web.py的开发,本节课我们详细说明django的开发与使用. 简介及可以学习到的内容: 1.Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表 ...

  8. python之总体理解

    作为脚本,python具备了弱类型语言的灵活性,便捷性.这在日常的开发使用中能够大幅度的减轻开发人员的编码负担,开发者也能够将精力集中在程序的逻辑管理和总体构架设计上.一般而言,随着经验的积累,开发人 ...

  9. maven-编译速度优化

    故障描述: 公司搭建了一个新jenkins持续集成环境,jenkins构建job时间越来越长. 原因分析: 系统CPU限制:判断依据,构建中查看日志 tail -f /var/log/messages ...

  10. Objective-c 多线程操作 自定义NSOperation 模拟下载

    写在前面 使用多线程下载图片,使用内存缓存和磁盘缓存. 这里只为理解NSOperation及其派生类 真要应用到APP中 请下载成熟的第三方库 效果 下载多张图片时可控制线程并发数 分析 自定义NSO ...