首 页 行业热点 新车 试驾评测 养车用车 车型库
当前位置:首页springboot使用之请求参数与基本注解

springboot使用之请求参数与基本注解

2020-02-04 来源:好土汽车网
导读 springboot使用之请求参数与基本注解
springboot使⽤之请求参数与基本注解

@PathVariable

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

@GetMapping(\"/car/{id}/owner/{username}\")

public Map getCar(@PathVariable(\"id\") Integer id, @PathVariable(\"username\") String name, ) {

Map map = new HashMap<>(); map.put(\"id\

map.put(\"name\ return map;

}

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

上⾯的例⼦有多个占位符,形参列表需要定义多个参数,不是很⽅便,可以直接定义⼀个map集合 @PathVariable Map kv,会⾃动映射多个参数

@GetMapping(\"/car/{id}/owner/{username}\")

public Map getCar( @PathVariable Map kv) { Map map = new HashMap<>(); String id = kv.get(\"id\");

String name = kv.get(\"username\"); map.put(\"id\

map.put(\"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 getUser(@RequestParam(\"age\") Integer age, @RequestParam(\"inters\") List inters, ) {

Map map = new HashMap<>(); map.put(\"age\ map.put(\"inters\ return map; }

请求⽰例:http://localhost:8080/user?age=18&inters=game&inters=music返回结果:{\"inters\":[\"game\

@RequestParam同样可以定义集合类型参数 @RequestParam Map 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\ 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\ 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\会怎样?

//控制台

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只影响属性在序列化和反序列化时的名称

因篇幅问题不能全部显示,请点此查看更多更全内容