使用@RequestBody传递多个不同对象

2023-05-16

@RequestBody

主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

示例:

@RestController
public class TestController{
  @RequestMapping("\myqxin")
  @ResponseBody
  public RetureResult test(@RequestBody User user){
    return new ReturnResult();
  }  
}

这样的方式只能接收一个json对象,有时我们需要接收多个json对象。

示例:

@RestController
public class TestController{
  @RequestMapping("\myqxin")
  @ResponseBody
  public RetureResult test(@RequestBody List<User> user){
    return new ReturnResult();
  }  
}

这样能接收多个同类型的json对象,但是有时我们需要接收的对象是不同类型的。需要接收多个不同的json对象

示例:

@RestController
public class TestController{
  @RequestMapping("\myqxin")
  @ResponseBody
  public RetureResult test(@RequestBody User user,@RequestBody Address address){
    return new ReturnResult();
  }  
}

上面这种方式就是错误的,原因是request的content-body是以流的形式进行读取的,读取完一次后,便无法再次读取了。

解决方式一

增加一个包装类,讲所需要的类写入,提供get/set

示例:

@RestController
public class TestController{
  @RequestMapping("\myqxin")
  @ResponseBody
  public RetureResult test(@RequestBody Param param){
    User user=param.getUser();
    Address address=param.getAddress();
    return new ReturnResult();
  }  
}
class Param{
 
    private User user;
    private Address address;  
 
    public User getUser() {
        return user;
    }
 
    public void setUser(User user) {
        this.user = user;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }

解决方式二

前端请求格式如下:

{
 "productFormInfos":[
{
  "attactMon": "3",		
  "claimP": "0.7",		
  "insuredAmt": "100000",	
  "insuredP": "0.2",		
  "notPayValue": "20000",	
  "type": "健康体",
  "usedDrug": "",		
  "waitMon1": "1",		
  "waitMon2": "5",		
  "waitMon3": "5"		
},
{
  "attactMon": "",
  "claimP": "0.3",
  "insuredAmt": "100000",
  "insuredP": "1",
  "notPayValue": "20000",
  "type": "带病体",
  "usedDrug": "0.2",
  "waitMon1": "",
  "waitMon2": "",
  "waitMon3": ""
}],
"cancerAttackInfos":[
{
  "cancerType": "全癌种",	
  "value": 1		
},
{
  "cancerType": "多发性骨髓瘤",
  "value": -0.7
}],
"znjsRegionInfos":[
  {
    "age1": "0.041985",	
    "age2": "0.0444276510925037",
    "age3": "0.0382427339114538",
    "age4": "0.0261105159086444",
    "age5": "0.0449479905248563",
    "age6": "0.0772911243564838",
    "age7": "0.0810856929668603",
    "age8": "0.0765560498761178",
	"age9": "0.0749054098877601",
	"age10": "0.0871027056596078",
	"age11": "0.0865625242702434",
	"age12": "0.0688175656296236",
	"age13": "0.0715534521423089",
	"age14": "0.0687895196577188",
	"age15": "0.0452628418871741",
	"age16": "0.0279018803309113",
	"age17": "0.0219935342690072",
	"age18": "0.0117872756063724",
	"age19": "0.00467652625930834",
	"age20": "0",
	"age21": "0",
    "livePopulation": "1001",		
    "mediInsuredPlt": "1549.7678",	
    "type": "城镇职工",
    "updateTime": "2021-04-21T03:01:04.108Z",
    "domicilePopulation": "1002",	
	"subUseP": "1",		
    "treatP": "1",
    "treatPD": "1",
    "treatPlanP": "1",
    "treatPlanPD": "1",
    "byStageP": "1",
    "byStagePD": "1",
    "diagnosisP": "1",
    "diagnosisPD": "1"
  },{
    "age1": "0.041985",
    "age2": "0.0444276510925037",
    "age3": "0.0382427339114538",
    "age4": "0.0261105159086444",
    "age5": "0.0449479905248563",
    "age6": "0.0772911243564838",
    "age7": "0.0810856929668603",
	"age8": "0.0765560498761178",
    "age9": "0.0749054098877601",
	"age10": "0.0871027056596078",
	"age11": "0.0865625242702434",
	"age12": "0.0688175656296236",
	"age13": "0.0715534521423089",
	"age14": "0.0687895196577188",
	"age15": "0.0452628418871741",
	"age16": "0.0279018803309113",
	"age17": "0.0219935342690072",
	"age18": "0.0117872756063724",
	"age19": "0.00467652625930834",
	"age20": "0",
	"age21": "0",
    "livePopulation": "1001",		
    "mediInsuredPlt": "349.83",		
    "type": "城乡居民",
    "domicilePopulation": "1002",	
    "subUseP": "1",			
    "treatP": "1",
    "treatPD": "1",
    "treatPlanP": "1",
    "treatPlanPD": "1",
    "byStageP": "1",
    "byStagePD": "1",
    "diagnosisP": "1",
    "diagnosisPD": "1"
  }]	
}

将接收参数定义为Map<String, Object>,然后使用map转object工具,转换成需要的对象。

此时,即使自定义的Param类中的属性即使比json数据中的属性少了,也没关系。

示例:

@RestController
public class TestController{
  @RequestMapping("\myqxin")
  @ResponseBody
  public Object test(@RequestBody Map<String, Object> models){
      String json1 = JSON.toJSONString(models.get("znjsRegionInfos"));
        String json2 = JSON.toJSONString(models.get("productFormInfos"));
        String json3 = JSON.toJSONString(models.get("cancerAttackInfos"));
        // 转json,这里接收的每个同类型对象都有多个,所以是个集合,需要转json
        List<ZnjsRegionInfo> znjsRegionInfos = JSON.parseArray(json1, ZnjsRegionInfo.class);
        List<ProductFormInfo> productFormInfos = JSON.parseArray(json2, ProductFormInfo.class);
        List<CancerAttackInfo> cancerAttackInfos = JSON.parseArray(json3, CancerAttackInfo.class);
   return models; 
 }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用@RequestBody传递多个不同对象 的相关文章

  • 索引签名的使用及松散索引签名

    索引签名的使用及松散索引签名 推荐 xff1a 阅读本文 xff0c 需要有一定的ts基础 xff0c 最好有理解字面量类型严格检测方面的知识 xff0c 才能理解奇怪的现象字面量严格检测官方描述 xff1a https github co
  • TS扩展类型

    扩展类型 以扩展interface为例 xff0c type同理使用type的规则扩展 xff0c 如typeA typeB 方式一 xff1a 类型声明文件使用declare关键字的 xff0c 直接在项目类型声明文件进行扩展 span
  • 深入理解node的web stream模块

    深入理解node的web stream模块 提示 xff1a 需要掌握node传统的流以及事件机制node环境 xff1a v16 5 0 43 一下内容全部以node v18 12 0实验为基础如果观看期间发现了一些不认识的api xff
  • Royal TSX 教程(macOS 的 SSH 工具)

    文章目录 引言一 下载安装二 汉化三 基础配置1 安装基础插件2 创建文档3 创建远程主机凭证4 Terminal xff08 终端 xff09 基础设置5 FTP xff08 文件传输 xff09 基础设置6 连接测试 四 高效使用技巧
  • Layui表格日期格式显示

    span class token punctuation span span class token punctuation span field span class token punctuation span span class t
  • maven项目关于target目录没有生成xml、properties等文件问题

    问题描述 xff1a 我在maven第一次弄了父子项目 xff0c 然后tomcat xff0c 启动失败 xff0c 报异常 xff1a class path resource applicationContext xml cannot
  • 虚拟机centos7 xshell连接不上虚拟机情况, net模式ping不通百度情况

    一 centos7 xshell连接不上虚拟机 win 43 R 然后 输入services msc 打开服务 看这俩服务开没开 看这俩网络开没开 xshell里 xff1a 二 ping不同百度 xff08 net模式 自定义IP地址 x
  • 糖尿病遗传风险检测挑战赛

    数据预读 数据集字段说明 编号 xff1a 标识个体身份的数字 xff1b 性别 xff1a 1表示男性 xff0c 0表示女性 xff1b 出生年份 xff1a 出生的年份 xff1b 体重指数 xff1a 体重除以身高的平方 xff0c
  • seata关于‘dataSourceProxy‘创建失败异常

    Caused by org springframework beans factory BeanCreationException Error creating bean with name dataSourceProxy defined
  • java生成文字二维码、url二维码

    java生成文字二维码 url二维码 pom xff1a 1 xff09 生成文字二维码java工具类 xff1a 2 xff09 url地址生成二维码java工具类 xff1a pom xff1a lt dependency gt lt
  • 根据图片URL下载到压缩包

    根据图片URL生成到压缩包 vo类工具类方法枚举类 vo类 span class token keyword package span span class token namespace com span class token punc
  • spring boot中thymeleaf配置说明

    spring boot中thymeleaf配置说明 thymeleaf是一种模板引擎 xff0c 可以查看页面的静态效果 也可以让程序员在服务器查看带数据的动态页面效果 引入依赖 xff0c 在pom xml文件添加以下内容 span cl
  • Ubuntu软件安装Ubuntu Software突然无法启动以及安装残留存在Install Release图标

    文章目录 背景Ubuntu默认的Linux内核无法启动Pycharm加载缓慢问题Ubuntu Software安装的软件无法打开 xff0c 即便是Ubuntu Software也无法打开 结果安装Ubuntu系统之后的残留 背景 之前在U

随机推荐

  • vue使用lottie web插件渲染动画

    1 先安装相应的插件 npm install lottie web save 2 引入插件 我这里是局部引入的 import lottieWeb from 39 lottie web 39 3 使用 xff0c 整体代码如下 xff0c 我
  • Apache 配置禁止IP地址访问,只允许使用域名的方式访问

    配置过程 提前安装好httpd服务器 正常IP地址访问效果 编辑主配置文件 在最后面添加如下信息即可 lt VirtualHost 80 gt DocumentRoot var www html error ServerName 192 1
  • 删掉启动分区进不了系统,复活办法(win10)

    删掉EFI启动分区进不了系统可以这样复活 xff08 win10 xff09 一 复活流程1 u盘制作启动盘2 创建efi分区 二 可能遇到的其他问题 一 复活流程 1 u盘制作启动盘 gt 链接直达 gt gt xff1a win10官方
  • 谈谈你对 多线程 的理解........

    目录 一 认识线程 xff1a xff08 1 xff09 线程和进程的区别 xff1a xff08 面试 xff09 xff08 2 xff09 线程创建 xff1a 二 Thread类及常见方法 xff1a xff08 1 xff09
  • GreenDao和Room

    GreenDao和Room比较 一个小测试insert 增select 查询所有update 修改同位置一条数据delete 删除同位置一条数据写了个kotlin的Room测了下 看如下结果总结 一个小测试 GreenDao版本 imple
  • Datawhale数据分析第一章第一节:数据载入及初步观察

    复习 这门课程得主要目的是通过真实的数据 xff0c 以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作 知道了课程的目的之后 xff0c 我们接下来我们要正式的开始数据分析的实战教学 xff0c 完成kaggle上泰坦尼克
  • VsCode使用相关

    1 解决VsCode控制条使用powershell问题 xff1a set ExecutionPolicy RemoteSigned 2 解决使用yarn安装报版本依赖问题 可升级依赖或忽略 yarn install ignore engi
  • python之Tkinter使用详解

    一 前言 1 1 Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块 Tkinter模块 Tk 接口 是Python的标准Tk GUI工具包的接口 作为 python 特定的GUI界面 xff0c 是一个图像
  • 实现使用libevent库创建服务器连接多个客户端并实现数据互发

    需要的头文件包含c库 Unix系统库和envent事件库 include lt sys types h gt include lt sys socket h gt include lt netinet in h gt include lt
  • 基于libevent库实现http-sever-restful-API

    文章目录 一 环境搭建 xff1a 1 编译libevent 2 1 11 stable2 cJSON库 二 makefile三 code四 测试测试结果如下 xff1a 一 环境搭建 xff1a 参考 xff1a https blog c
  • vscode通过跳板机连接远程服务器(亲测可用)

    一 windows用户需要先配置好本地的Remote SSH相关服务并开启服务 二 打开VS Code xff0c 在扩展中搜索 34 Remote SSH 34 并安装 三 ctrl 43 shift 43 p呼出控制面板搜索remote
  • 如何抓取log

    一 Catcher log Catcher是 MTK 提供的功能机上一个功能比较强大的一个 log 工具 Catcher log 一般情况下使我们使用起来最多也最方便的一种 xff0c 不用跳线 xff0c 连接上 USB 就行 Catch
  • android studio (record audio)一些问题记录

    2022 03 29 19 23 16 253 1659 1706 E Request requires android permission RECORD AUDIO 2022 03 29 19 23 16 253 1659 1706 E
  • 向量的点乘和叉乘

    向量是由n个实数组成的一个n行1列 xff08 n1 xff09 或一个1行n列 xff08 1n xff09 的有序数组 一 向量的点乘 也叫向量的内积 数量积 xff0c 对两个向量执行点乘运算 xff0c 就是对这两个向量对应位一一相
  • C语言 生产者消费者问题

    目录 生产者消费者问题算法设计实现源程序测试日志总结 生产者消费者问题 算法设计 实现 1 编写所需头文件 span class token macro property span class token directive keyword
  • 操作系统-进程同步:生产者-消费者问题

    文章目录 进程同步 xff1a 生产者 消费者问题问题描述实验环境输入输出测试数据实验设计数据结构系统框架图流程图 实验结果与分析结果展示与描述结果分析总结 源代码 进程同步 xff1a 生产者 消费者问题 问题描述 以生产者 消费者模型为
  • 《动手学习深度学习》预备知识——自动求导

    自动微分 正如我们在 numref sec calculus中所说的那样 xff0c 求导是几乎所有深度学习优化算法的关键步骤 虽然求导的计算很简单 xff0c 只需要一些基本的微积分 但对于复杂的模型 xff0c 手工进行更新是一件很痛苦
  • Ubuntu—root用户权限设置

    Ubuntu root用户权限设置 本人ubuntu版本 xff1a 18 04 xff08 其他版本设置步骤相同 xff09 Step1 获得临时root权限 xff08 1 xff09 terminal中输入命令 xff1a sudo
  • matlab 自写 自适应中值滤波 matlab自适应中值滤波算法

    一 自适应中值滤波 xff08 代码 xff09 function aOut 61 stPlus aIn f1 f2 st stMax 这仅仅是 AdaMedFilter 自适应中值滤波函数 的子函数 这仅仅是一个附属函数 功能片段 xff
  • 使用@RequestBody传递多个不同对象

    64 RequestBody 主要用来接收前端传递给后端的json字符串中的数据的 请求体中的数据的 xff1b GET方式无请求体 xff0c 所以使用 64 RequestBody接收数据时 xff0c 前端不能使用GET方式提交数据