@PathVariable
作⽤:@PathVariable是spring3.0的⼀个新功能:接收请求路径中占位符的值,将URL中占位符参数{xxx}绑定到处理器类的⽅法形参中@PathVariable(“xxx“)
@GetMapping(\"/car/{id}/owner/{username}\")
public Map Map map.put(\"name\ return map; } 请求参数⽰例:http://localhost:8080/car/2/owner/birdy 上⾯的例⼦有多个占位符,形参列表需要定义多个参数,不是很⽅便,可以直接定义⼀个map集合 @PathVariable Map @GetMapping(\"/car/{id}/owner/{username}\") public Map 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 Map 请求⽰例:http://localhost:8080/user?age=18&inters=game&inters=music返回结果:{\"inters\":[\"game\ @RequestParam同样可以定义集合类型参数 @RequestParam Map @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只影响属性在序列化和反序列化时的名称 因篇幅问题不能全部显示,请点此查看更多更全内容