@PathVariable

作用:@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值,将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)

 @GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
) {
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
return map;
}

请求参数示例:http://localhost:8080/car/2/owner/birdy

上面的例子有多个占位符,形参列表需要定义多个参数,不是很方便,可以直接定义一个map集合 @PathVariable Map<String,String> kv,会自动映射多个参数

@GetMapping("/car/{id}/owner/{username}")
public Map<String,Object> getCar( @PathVariable Map<String,String> kv) {
Map<String,Object> map = new HashMap<>();
String id = kv.get("id");
String name = kv.get("username");
map.put("id",id);
map.put("name",name);
return map;
}

@RequestParam

@RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上

语法:

@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
  • value:请求中传入参数的名称,即前端传过来时定义的参数名。如果不设置value值,

    则前端定义的参数名必须和后端接口参数名相同
  • required:该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误;如果设置为false,当请求中没有此参数,将会默认为null。而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
  • defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties['java.vm.version']}"
 @GetMapping("/user")
public Map<String,Object> getUser(@RequestParam("age") Integer age,
@RequestParam("inters") List<String> inters,
) {
Map<String, Object> map = new HashMap<>();
map.put("age",age);
map.put("inters",inters);
return map;
}
请求示例:http://localhost:8080/user?age=18&inters=game&inters=music
返回结果:{"inters":["game","music"],"age":18}

@RequestParam同样可以定义集合类型参数 @RequestParam Map<String,String> params来映射多个参数

@RequestBody

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

注意点:

  • GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交
  • 在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个
  • 如果参数时放在请求体application/json传入后台的话,那么后台要用@RequestBody才能接收到
  • 如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam来接收,或者形参前 什么也不写也能接收

在实际的工作需求中,写接口的人会经常遇到对于Bean各种各样的操作,比如我对数据库要写个Bean,返回前台还得有个Vo bean,在另一个需求又用到和这个类似的Bean了,但是就有些字段不一样啊,字段的有些类型不一样啊,接收的参数名不一样啊,反正就是一个小小的需求变动,可能就需要写好几个不同的Bean,之前需求没那么多的时候写两个就写两个吧,后来写的多了就烦了,所以认真研究下怎么转换就迫在眉睫了。

@JsonAlias

作用是在反序列化的时候可以让Bean的属性接收多个json字段的名称。可以加在字段上或者getter和setter方法上。

@Data
public class User implements Serializable{
@JsonAlias({"name","user"})
private String username;
private String password;
private Integer age;
}

实体类需要有get和set方法

@PostMapping("/user")
public User getUserIfo(@RequestBody User user){
return user;
}

路径http://localhost:8080/user

//入参
{
“name” : “小明”,
“password” : “123”,
"age" : 15
}

可以从下面看到json字段是name也成功对应到了Bean的username属性 ,但是字段名没变

//postman返回结果
{
"username": "birdy",
"password": "123",
"age": 18
}

@JsonProperty

  • 向流中写入对象的操作 称为 序列化

  • 从流中读取对象的操作 成为 反序列化

这个注解是更改Bean字段的属性名用的。

  • access:是更改逻辑属性序列化和反序列化的可见性,

Access.WRITE_ONLY:只在序列化时使用修改后的字段

Access.READ_ONLY:只在反序列化时使用,类似于@JsonAlias注解

Access.READ_WRITE:在序列化和反序列化都使用修改后字段

Access.AUTO:自动确定,一般是和第三个一样,啥情况不一样我也不清楚,如果不写access,默认就是这个。

value是逻辑属性的名称,如果只有value则省略

  • value::更改后的属性名

示例

@Data
public class User implements Serializable {
//只在序列化写入操作时使用该属性名
@JsonProperty(value = "name", access = JsonProperty.Access.WRITE_ONLY)
private String username;
private String password;
private Integer age;
}
@PostMapping("/user")
public User getUserIfo(@RequestBody User user){
System.out.println(user.toString());
return user;
}

入参:

{
"name" : "birdy",
"password" : "123",
"age" : 18
}

结果:

//console
User(username=birdy, password=123, age=18)
//postman没有获取到name属性
{
"password": "123",
"age": 18
}

查看源码

Access setting that means that the property may only be written (set)
as part of deserialization (using "setter" method, or assigning to Field

表示只有在写入时调用属性的set方法才会用该属性名

猜猜若改成@JsonProperty(value = "name", access = JsonProperty.Access.READ_ONLY)会怎样?

//控制台
User(username=null, password=123, age=18)
//postman
{
"password": "123",
"age": 18,
"name": null
}

由于写入时无法调用set方法赋值,所以控制台打印该属性时没有值;但是返回结果已经可以调用修改后的属性get方法,所以username属性已经被修改为name,只是没有值

若是access = JsonProperty.Access.AUTO

//控制台
User(username=birdy, password=123, age=18)
//postman
{
"password": "123",
"age": 18,
"name": birdy
}

可以看到控制台打印的属性名称都没有变,access只影响属性在序列化和反序列化时的名称

springboot使用之请求参数与基本注解的更多相关文章

  1. SpringBoot获取http请求参数的方法

    SpringBoot获取http请求参数的方法 原文:https://www.cnblogs.com/zhanglijun/p/9403483.html 有七种Java后台获取前端传来参数的方法,稍微 ...

  2. springboot获取URL请求参数的多种方式

    1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交. /** * 1.直接把表单的参数写在Controller相应的方法的形参中 * @pa ...

  3. springboot获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...

  4. springmvc请求路径和请求参数的获取注解- @PathVariable和@RequestParam

    @PathVariable和@RequestParam @PathVariable是从路径里面去获取变量,也就是把路径当做变量. @RequestParam是从请求里面获取参数. 如:url:http ...

  5. SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/ SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求 ...

  6. SpringMVC请求参数的获取方式

    一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...

  7. springboot(服务端接口)获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 一.下面为7种服务端获取前端传过来的参数的方法  常用的方法为:@RequestParam和@Req ...

  8. SpringBoot系列教程web篇之Post请求参数解析姿势汇总

    作为一个常年提供各种Http接口的后端而言,如何获取请求参数可以说是一项基本技能了,本篇为<190824-SpringBoot系列教程web篇之Get请求参数解析姿势汇总>之后的第二篇,对 ...

  9. SpringBoot系列教程web篇之Get请求参数解析姿势汇总

    一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,而post请求可以不在url中:那么一个 ...

随机推荐

  1. FormData上传文件 带进度条

    * jQuery ajax  FormData 上传文件 template $.ajax({ url: url, type: 'POST', data: new FormData(form), dat ...

  2. jmeter跑脚本的注意事项

    指标主要看以下几点: 1.jmeter性能测试的报告,不要看平均响应时间,而是看90%响应时间,一般不能超过3s,超过3s则不符合标准2.响应时间超过3s就要优化,但不是平均响应时间,因为最小响应时间 ...

  3. 一个故事,一段代码告诉你如何使用不同语言(Golang&C#)提供相同的能力基于Consul做服务注册与发现

    目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过Htt ...

  4. Unity——基于UGUI的UI框架

    基于UGUI的UI框架 一.Demo展示 二.关键类 MonoSingle 继承MonoBehaviour的单例基类:做了一些特殊处理: 保证场景中必须有GameInit名称的物体,所有单例管理器脚本 ...

  5. 每日总结:Number&Math类(2021.10.4)

    Java语言为每一个内置数据类型提供了对应的包装类. 所有的包装类(Integer.Long.Byte.Double.Float.Short)都是抽象类Number的子类 其中Integer 对应的基 ...

  6. jenkins容器内安装Python3之后使用pip3 install xxx失败,可以考虑换国内源

    问题:pip3 install xxx失败 方案一:修改配置文件 首先在当前用户目录下建立文件夹.pip,然后在文件夹中创建pip.conf文件,再将源地址加进去即可. mkdir ~/.pipvim ...

  7. 使用 z3 进行逆向 解密字符串

    在逆向过程中,我们知道了一个结果值,和一段计算代码.这个时候我们需要知道计算前的值是什么:需要用到 z3 模块来进行解题 z3项目地址 Java代码如下: private String b(Strin ...

  8. 想要彻底搞懂大厂是如何实现Redis高可用的?看这篇文章就够了!(1.2W字,建议收藏)

    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间. 假设系统一直能够提供服务,我们说系统的可用性是100%.如果 ...

  9. 【UE4 C++ 基础知识】<5> 容器——TArray

    概述 TArray 是UE4中最常用的容器类.其速度快.内存消耗小.安全性高. 其设计时未考虑扩展问题,因此建议在实际操作中勿使用 新建(new) 和 删除(delete) 创建或销毁 TArray ...

  10. ORB_SLAM3 -- 配置安装

    安装环境 Ubuntu20.04 ORB_SLAM3依赖项安装 opencv3 ORB_SLAM3可用opencv3或opencv4编译,作者这里安装测试了opencv3 Step1: 安装openc ...