背景:

最近项目中使用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,问题解决!

转载于:https://www.cnblogs.com/jing-an-feng-shao/p/7426091.html

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

  1. php怎么传json数据_php怎么接收前端传来的json数据

    php怎么接收前端传来的json数据php 如何接收前端传来的json数据 前端用JQ 生成一个有字段名和值格式的键值对 的JSON 格式的字串 转码后 提交给后台的PHP 处理 代码如下 json_ ...

  2. SpringBoot接收前端传来的json数据

    当前端传来json数据时,后端有多种方式接收 前端json数据: {id:121, //数字name:"lhj", //字符串scoreList:[ //对象{Java:95}, ...

  3. 如何接收前端传来的json数据

    我是小康小白,一个平平无奇的Java小白.热爱有趣的文字,生活和远方. 从前端获取json格式包的数据,而不是仅仅通过参数来获得 1.第一种使用使用IOUtils的读取包方式 但这种方法需要jar包 ...

  4. Java如何处理前端传来的json格式的数据并将它转化为相应的对象,然后进行使用

    我是小康小白,一个平平无奇的Java小白.热爱有趣的文字,生活和远方. 前端传来json格式的数据传递而来,如何处理json格式的数据,如何将其转化为对象方便进行操作,并在Servlet页面中将数据以 ...

  5. SpringMVC获取前端传来的json数据的四种方法(前后端json交互总结)

    一.导包 一定要有 Jackson 的jar包依赖,就算有了fastjson,也要有Jackson包 <dependency><groupId>com.fasterxml.ja ...

  6. java后端接收前端传来的String数组

    我们来看下面一段代码,我们需要接收前端传来的String字符数组:我们来模拟下错误传参: @PostMapping("/getStrArray")public ResponseMe ...

  7. Springboot后台接收前端Date类型

    From: https://my.oschina.net/zicheng/blog/2963117 这个问题不是专门针对Springboot的,Springmvc也同样适用于这一个问题. 昨的是Spr ...

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

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

  9. SpringBoot无法接收到前端传来的json数据

    如果是get请求,看Controller接收前端数据的dto有没有@Validated @RequestMapping(value = "/update")@ResponseBod ...

  10. hph中将前端接收的数据由json格式转成array

    //接收前端的数据   $postData储存前端传来的数据 $postData = file_get_contents("php://input");  echo $postDa ...

最新文章

  1. 区块链和智能合约的关系
  2. 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力!
  3. java实践源码--哈弗曼树
  4. X509Certificate2 本地正常,放到线上内部错误
  5. Linux ALSA声卡驱动之四:Control设备的创建
  6. java面向对象内存分析
  7. 在C语言中如何高效地复制和连接字符串?
  8. 编程语言python入门-Python基础教程 - 全文
  9. 74LS系列芯片简记——10-19
  10. VS2017社区版+OpenCV3.4.10配置
  11. 后盾人tp5教程_5个出色的应用程序以开放数据为后盾
  12. 华为云用docker部署halo
  13. 强烈推荐的程序员键盘--红轴手感好按键压力小写代码更轻松
  14. html5实现canvas迷宫游戏,HTML5/Canvas/JS 迷宫生成动画
  15. 单片机小精灵(延时、定时计算软件)
  16. 教你在WORD中如何制作三线表
  17. iOS获取APP在苹果App Store中的最新版本信息
  18. 基于嵌入式技术的网络视频监控系统
  19. 我们正处于并将长期处于从“艺工交叉”到“自我创造”的过渡阶段
  20. 英国访问学者签证材料要求

热门文章

  1. Git 多平台换行符问题(LF or CRLF)
  2. 什么是:before和:after?
  3. 技术思考--不要从技术的角度去思考大数据的落地
  4. ABP源码分析二十八:ABP.MemoryDB
  5. STM32相关手册使用记录
  6. Sitecore开发 IP地理定位服务入门
  7. 做一款仿映客的直播App
  8. SharePoint 2013 的HTML5特性之响应式布局
  9. ZendFramework多模块配置
  10. 高性能Javascript重绘和重排学习笔记