亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

目录
  • SpringBoot 参数传递及@RequestBody注解注意点
    • 前台正确的js书写格式是
    • 后台正确的Controller书写格式是
  • RequestBody 作为参数使用
    • 为了证实这个想法,自己书写一个请求类
    • 小结一下

SpringBoot 参数传递及@RequestBody注解注意点

前台正确的js书写格式是

//点击查询, 执行下面这个函数
$("#searchByCriteria").click(function () {
     //var paramdata = $("#bck_qry_criteria_form").serializeJson();//serializeJson()是自定义的form 格式化为json函数
     var paramdata = {
         type:$("#bck_type").val(),
         title:$("#bck_title").val(),
         start:$("#bck_start").val(),
         end:$("#bck_end").val()
     };
     paramdata = JSON.stringify(paramdata);
     $.ajax({
         type: "post",
         data: paramdata,
         url: "/getNews",
         cache:false,
         headers : {"Content-Type" : "application/json;charset=utf-8"},
         success: function (data) {
             var code = data.code;
             var t = data.t;
             if (code == 200){alert(JSON.stringify("提交成功! 我们会尽快联系您!"));}
             if (code == 500){alert(JSON.stringify(t));}
             //$("#input_phone").val("");//清空输入框
         }
     })
 });

上面中传递的参数一定要用JSON.stringify(paramdata); 方法将参数转换成json格式的字符串; 因为SpringBoot 中@RequestBody注解要求的必须是json格式的字符串才能注入参数, 第二就是大坑, 大坑, 大坑, 请求中必须 带上请求头,不然会报下面错误

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

后台正确的Controller书写格式是

其中consumes = “application/json”, 规范的讲是要加的, 它规范了,前台要传递json格式的参数. 但是如果你不加也是可以的, 亲测不加也能封装到参数.NewsParamsMap中属性

@PostMapping(value = "/getNews",  consumes = "application/json")
@ResponseBody
public PageInfo<NewsList> getNewsList(@RequestBody NewsParamsMap map){
    System.out.println("这是正确的用法");
    return null;
}

NewsParamsMap 中有Integer 有Date, 前台传过来都是字符串, springboot,会根据名称一一对应, 将数据转换成相应的类型.

public class NewsParamsMap {
    private Integer type;
    private String title;
    private Date start;
    private Date end;
   ...
   set get 方法
   ...
}

RequestBody 作为参数使用

最近在接收一个要离职同事的工作,接手的项目是用SpringBoot搭建的,其中看到了这样的写法:

在CODE上查看代码片 派生到我的代码片

@RequestMapping("doThis")
public String doThis(HttpServletRequest request,
        @RequestParam("id") Long id, // 用户ID
        @RequestParam("back_url") String back_url, // 回调地址
        @RequestBody TestEntity json_data // json数据,对于java实体类
){//...  

这个是一个请求映射方法,然后用浏览器输入url:

http://127.0.0.1:8080/test/doThis?id=1&back_url=url&json_data={"code":2,"message":"test"}

在这个方法中,使用@RequestParam获取参数,然后使用@RequestBody对json格式的参数转换为Java类型

在运行的时候发现报错:Required request body is missing

@RequestBody的使用需要加载MappingJackson2HttpMessageConverter,但是SpringBoot的官方文档提到,这个是默认已经加载的了,而且json字符串和javabean也没有书写的错误

因此考虑到应该是请求Content-Type的问题,因为使用浏览器输入url的方式没有办法定义Content-Type,因此spring无法发现request body

为了证实这个想法,自己书写一个请求类

在CODE上查看代码片 派生到我的代码片

String add_url = "http://127.0.0.1:8080/test/doThis";
   URL url = new URL(add_url);
   HttpURLConnection connection = (HttpURLConnection)url.openConnection();
   connection.setDoInput(true);
   connection.setDoOutput(true);
   connection.setRequestMethod("POST");
   connection.setUseCaches(false);
   connection.setInstanceFollowRedirects(true);
   connection.setRequestProperty("Content-Type","application/json");
   connection.connect();
   DataOutputStream out = new DataOutputStream(connection.getOutputStream());
   JSONObject obj = new JSONObject();  

   obj.put("code", -1002);
   obj.put("message", "msg");
   out.writeBytes(obj.toString());
   out.flush();
   out.close(); 

请求还是失败,经过调试,发现需要去掉所有的@RequestParam注解才能成功

小结一下

1、@RequestBody需要把所有请求参数作为json解析,因此,不能包含key=value这样的写法在请求url中,所有的请求参数都是一个json

2、直接通过浏览器输入url时,@RequestBody获取不到json对象,需要用java编程或者基于ajax的方法请求,将Content-Type设置为application/json

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于Springboot | @RequestBody 接收到的参数对象属性为空的问题

    背景 今天在调试项目的时候遇到一个坑,用Postman发送一个post请求,在Springboot项目使用@RequestBody接收时参数总是报不存在,但是多次检查postman上的请求格式以及项目代码都没有问题 Postman: 请求参数: { "firstName":"fdsaf", "lastName":"dfasdf" } Controller: Entity 通过debug模式可以发现传进到实体的参数都为null

  • 解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    此处网上最多的做法是需要修改tomcat的参数配置大致如下: <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443" URIEncoding="UTF-8" maxThreads="3000" compression="on" compress

  • Spring Boot中@RequestParam参数的5种情况说明

    目录 Spring Boot中@RequestParam参数的5种情况 实例如下: Spring Boot注解:@RequestParam详解 1.value:参数名字,即入参的请求参数名字 ​2.required:该参数是否为必传项. ​3.defaultValue:参数的默认值 Spring Boot中@RequestParam参数的5种情况 实例如下: // 可带参数可不带参数,方法都能执行 @RequestMapping("/list") public String test1

  • 使用@RequestBody传对象参数时碰到的坑

    目录 @RequestBody传对象参数时碰到的坑 我的真实代码是这样的: 也就是下面的区别: @RequestBody 的正确使用 @RequestBody接收的是一个Json对象 @RequestBody的使用 @RequestBody传对象参数时碰到的坑 工作中需要使用到http接口传一个对象数组,网上找到某博客:springmvc参数为对象,数组 但是测试还是不对,报错: 2019-02-21 23:44:37.168 WARN 34133 --- [nio-7001-exec-6] .

  • Spring boot @RequestBody数据传递过程详解

    这篇文章主要介绍了Spring boot @RequestBody数据传递过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @RequestBody需要接的参数是一个string化的json @RequestBody,要读取的数据在请求体里,所以要发post请求,还要将Content-Type设置为application/json java的api 参数为JSONObject,获取到的参数处理 @PostMapping("/combine

  • 亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

    目录 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 后台正确的Controller书写格式是 RequestBody 作为参数使用 为了证实这个想法,自己书写一个请求类 小结一下 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 //点击查询, 执行下面这个函数 $("#searchByCriteria").click(function () { //var paramdata = $(&quo

  • Springboot @RequestBody注解踩坑记录

    目录 @RequestBody注解踩坑 @RequestBodyjson注入Bean属性为空 @RequestBody注解的一些注意事项 @RequestBody注解踩坑 @RequestBody json注入Bean属性为空 1.接收JSON数据注入到Bean中,必须要加RuquestBody注解 2.判断属性名称字段是否相同 3.spring 默认不为首字母大写的JavaBean进行赋值操作,若首字母大写进行赋值操作需加入@JsonProperty(value=“AlarmTime”)注解

  • springboot 多数据源配置不生效遇到的坑及解决

    目录 多数据源配置不生效遇到的坑 解决方案 踩坑SpringBoot配置多数据源,循环引用问题 解决办法 多数据源配置不生效遇到的坑 ** 同步数据时遇到多个数据源切换的问题,配置了yml文件时候发现启动的时候不加载数据源的配置. ** spring: datasource: db1: driver-class-name:xxxxxxx url:jdbc:xxxxxxx username:root password:111111 db2: driver-class-name:xxxxxx url

  • jpa使用manyToOne(opntional=true)踩过的坑及解决

    目录 jpa使用manyToOne(opntional=true)踩坑 @ManyToOne用于一对多的情况 @manytoone设置为optional=true不起作用 @manytoone 原因 jpa使用manyToOne(opntional=true)踩坑 @ManyToOne用于一对多的情况 (默认情况下是懒加载的,没必要去配置哦)如:一个account可以对应多个accountPrivilege @Entity @Table(name = ACCOUNT_PRIVILEGE) pub

  • Centos7安装docker compse踩过的坑及解决方法

    一.安装方式 1.官方安装方式 sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose 给docker-compose执行权限 docker-compose --version 测试安

  • 使用springboot单例模式与线程安全问题踩的坑

    springboot单例模式与线程安全问题踩的坑 最近有客户反映,使用公司产品时,偶尔会存在崩溃情况,自己测试无问题,然后去查日志,是报空指针. 于是顺藤摸瓜 往上找,好嘛,之前的开发使用了成员变量,感觉问题就是在这里了,因为众所周知,springboot 采用的是单例模式,所以,使用成员变量时一定要谨慎. 下面上一张该类的截图: 大家可能看到了,该类上面加上了@Scope("prototype") 注解,该注解的作用是将该类变成多例模式.讲道理因为变为了多例,应该不会有线程问题了.

  • 微信小程序使用websocket通讯的demo,含前后端代码,亲测可用

    0.概述websocket (1) 个人总结:后台设置了websocket地址,服务器开启后等待有人去连接它. 一个客户端一打开就去连接websocket地址,同时传递某些识别参数.这样一来后台和客户端连接成功了,然后后台就可以发消息给客户端了,(客户端也可以再回话给后台). (2) socket叫套接字,应用程序用socket向网络发出请求或者应答网络请求. (3) 官方解释的socket 建立连接四步骤: 服务器端开启socket,然后accep方法处于监听状态,等待客户端的连接. 客户端开

  • 解决IDEA2020.2插件lombok报错问题(亲测有效)

    先看看问题是否和我一样 由于我的修复好了,所以我的没错误了,我指出我以前的错误看是否匹配 当你只写一个注解的时候是好的,有时候写第一个注解的时候就崩了,第二个注解就更不用说了 是不是下面这个红框框的标志都不见了?并且你的右下角也报错了 如果是可以直接下载这个非官方补丁: 链接:https://pan.baidu.com/s/1QvDWMN3aihHHus9f1pVPFQ 提取码:we6s 下载下来后是直接是这个样子的 因为我安装的是解压后的,所以我发的是解压后的,如果安装有问题可以在评论区告诉我

  • 解决SpringBoot中使用@Async注解失效的问题

    错误示例,同一个类中使用异步方法: package com.xqnode.learning.controller; import com.fasterxml.jackson.core.JsonProcessingException; import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.GetMapping; import org.springf

  • VMware安装苹果虚拟机的教程(亲测有效)

    写在前面 工欲善必先利其器(虽然能去苹果机房做,但我太菜了,能玩一年 ),虽然没有苹果机,但是可以在虚拟机上操作一波. 主要还是unlock和找镜像,网上不乏类似的博客,但大都年代比较久远,版本各种不兼容,导致根本不能复现,我也踩了很多坑,花费了大量心血时间才终于可了. -2020.11.3 如果百度网盘链接失效什么的请联系我 先上结果图和版本号: VMare 去官网下载最新版 https://www.vmware.com/products/workstation-pro/workstation

随机推荐