springboot @RequestBody注解学习

Posted 胖鹅68

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot @RequestBody注解学习相关的知识,希望对你有一定的参考价值。

文章引用

  1. @RequestBody的使用

功能介绍

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);

GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

如果@RequestParam()的用法不理解,请参考——《springboot controller接收参数》

JSON字符串转换对象的逻辑

  1. 后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)

  2. json字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。

  3. json字符串中,如果value为null的话,后端对应收到的就是null。

  4. 如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或"“都行。千万不能有类似"stature”

案例描述

package com.hb.market.dictionary.ctrl;

import java.util.List;

import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.hb.market.dictionary.entity.Dictionary;
import com.hb.market.dictionary.service.IDictionaryService;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

@Controller
@RequestMapping("/dictionary")
@Api(tags = "数据字典管理", value = "数据字典控制器")
public class DictionaryController 
	
	@Resource
	private IDictionaryService dictionaryService;
	
	@ApiOperation("根据code查询数据字典")
	@ApiImplicitParam(name = "code", value = "字典码", dataType = "String")
	@GetMapping("/findByCode/code")
	@ResponseBody
	public List<Dictionary> findDictionaryByCode(@PathVariable("code") String code) 
		System.out.println(dictionaryService);
		List<Dictionary> list = dictionaryService.findDictionaryByCode(code);
		return list;
	
	
	@ApiOperation(value = "添加数据字典对象", notes = "添加数据字典对象")
	@ApiImplicitParams(
		@ApiImplicitParam(name = "code", value = "字典编码"),
		@ApiImplicitParam(name = "value", value = "字典值"),
		@ApiImplicitParam(name = "name", value = "字典显示名字"),
		@ApiImplicitParam(name = "desc", value = "字典描述"),
	)
	@PostMapping("/addDictionary")
	@ResponseBody
	// @RequestBody 会将前端传递过来的JSON字符串转为复杂的Dictionary对象
	public Dictionary addDictionary(@RequestBody Dictionary dictionary) 
		System.out.println(dictionary);
//		Dictionary dicObj = dictionaryService.addDictionary(dictionary);
		return null;
	
	
	@PostMapping("/searchDictionary")
	@ResponseBody
	public List<Dictionary> searchDictionary(@RequestBody Dictionary dictionary) 
		System.out.println(dictionary);
		List<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
		return list;
	

如果使用@RequestBody,postman 传递参数的方式(传递JSON)


备注: 如果后台不是用@RequestBody修饰,则,可以使用 form-data 或者 x-www-form-unlencodeed 两种方式传递参数, spring 会帮助我们自动转换

前后端案例说明

后台使用@RequestBody修饰接收参数

后端代码使用 @RequestBody说明

@PostMapping("/searchDictionary")
public Object searchDictionary(@RequestBody Dictionary dictionary) 
	log.info(dictionary.toString());
	Page<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
	return ObjectToResult.getResult(list);

前端传递参数用是字符串,header需要设置application/json

function postFetchAction() 
  var paramObj = 
	value: "food",
	pageSize: 4,
	pageNum: 1
  ;
  var options = 
	// 如果后台使用@RequestBody修饰接收参数, content-type 一定不能少,否则会报错
	headers: 
	  "content-type": "application/json"
	,
	method: "POST", // *GET, POST, PUT, DELETE, etc.
	mode: "cors", // no-cors, cors, *same-origin,
	body: JSON.stringify(paramObj)
  ;
  fetch("http://localhost:8080/dictionary/searchDictionary", options)
	.then(function(res) 
	  debugger;
	  console.log(res);
	  // 这个函数返回的是接口响应的值,执行后面的then 方法
	  return res.json();
	)
	// 第二个 then 才是获取后台实际返回的结果
	.then(function(response) 
	  debugger;
	  console.log(response);
	);

使用postman 的方式

后台没有@RequestBody修饰接收参数

后端代码对象不用@RequestBody修饰

@PostMapping("/searchDictionary")
public Object searchDictionary(Dictionary dictionary) 
	log.info(dictionary.toString());
	Page<Dictionary> list = dictionaryService.findDictionaryByObject(dictionary);
	return ObjectToResult.getResult(list);

前端代码使用FormData传递参数,header不需要设置application/json

function postFetchAction() 
  var formData = new FormData();
  formData.append('value', 'food');
  formData.append('pageSize', 4);
  formData.append('pageNum', 1);

  var options = 
	// 则header 不需要设置 "content-type": "application/json"
	headers: ,
	method: "POST", // *GET, POST, PUT, DELETE, etc.
	mode: "cors", // no-cors, cors, *same-origin,
	body: formData
  ;
  fetch("http://localhost:8080/dictionary/searchDictionary", options)
	.then(function(res) 
	  debugger;
	  console.log(res);
	  // 这个函数返回的是接口响应的值,执行后面的then 方法
	  return res.json();
	)
	// 第二个 then 才是获取后台实际返回的结果
	.then(function(response) 
	  debugger;
	  console.log(response);
	);

使用postman 的方法

以上是关于springboot @RequestBody注解学习的主要内容,如果未能解决你的问题,请参考以下文章

注解@RequestMapping,@RequestBody

SpringBoot 上传/返回图片与Base64转换

Kotlin Spring Boot Webflux 使用 @Valid 注解验证 @RequestBody

SpringBoot常用注解

springboot常用注解

SpringBoot