写点什么

@RequestParam、@ModelAttribute、

  • 2022 年 4 月 25 日
  • 本文字数:1585 字

    阅读完需:约 5 分钟

1、@RequestBody 简介

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


@RequestBody 用于 post 请求,不能用于 get 请求。


注:一个请求,只有一个 RequestBody;一个请求,可以有多个 RequestParam。


注:当同时使用 @RequestParam()和 @RequestBody 时,@RequestParam()指定的参数可以是普通元素、数组、集合、对象等等(即 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 :当,@RequestBody 与 @RequestParam()可以同时使用时,原 SpringMVC 接收参数的机制不变,只不过 RequestBody 接收的是请求体里面的数据;而 RequestParam 接收的是 key-value 里面的参数,所以它会被切面进行处理从而可以用普通元素、数组、集合、对象等接收)。


即:如果参数时放在请求体中,application/json 传入后台的话,那么后台要用 @RequestBody 才能接收到;


如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用 @RequestParam 来接收,或形参前什么也不写也能接收。


如果后端参数是一个对象,且该参数前是以 @RequestBody 修饰的,那么前端传递 json 参数时,必须满足以下要求:


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

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

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

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

2、传入 list

@GetMapping("/getUserLogin")


public String getUserLogin(@RequestBody UserLogin userLogin,


@RequestParam("arrays") List<String> arrays){


StringBuilder sb = new StringBuilder();


for(String array : arrays){


sb.append(array);


sb.append(",");


}


return sb + "," + userLogin;


}

3、核心逻辑分析

@RequestBody 接受 json 时,核心逻辑分析示例


假设前端传的 json 串是这样的:?{"name1":"素小暖","age":18}?后端的模型只有 name 和 age 属性,以及对应的 setter/getter 方法;给出一般用到的 deserializeFromObject(JsonParser?p, DeserializationContext?ctxt)方法的核心逻辑:



//前提是前端传入的是 json 数据


//@JsonAlias 表示当进行前端接口调用的时候,user 中 username 传入"userName","userName","UserName"都可接收


//@JsonProperty 表示只能传入 passWord,password 都无法进行调用


@Data


public class User{


@JsonAlias(value={"userName","userName","UserName"})


private String username;


@JsonProperty(value="passWord")


private String password;


}


@PostMapping("/getUserLogin")


public User getUserLogin(@RequestBody User user){


...


}


注意:


  1. @JsonAlias 注解需要依赖于 setter、getter,而 @JsonProperty 注解不需要。

  2. 在不考虑上述两个注解的一般情况下,key 与属性匹配时,默认大小写敏感。

  3. 有多个相同的 key 的 json 字符串中,转换为模型时,会以相同的几个 key 中,排在最后的那个 key 的值给模型属性复制,因为 setter 会覆盖原来的值。

  4. 后端 @RequestBody 注解对应的类在将 HTTP 的输入流(含请求体)装配到目标(即:@RequestBody 后面的类)时,会根据 json 字符串中的 key 来匹配对应实体类的属性,如果匹配一致且 json 中的该 key 对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的 setter 方法将值赋给该属性。上一篇:[【全栈最全 Java 框架总结】SSH、SSM、Springboot](()下一篇:[SpringCloud 学习总纲](()

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
@RequestParam、@ModelAttribute、_Java_爱好编程进阶_InfoQ写作社区