目录
0. 总结
@RequestParam 适用于普遍一般情况
@RequestBody 适用于传递复杂对象,以及文件等复杂数据
@ PathVariable 适用于RestFul风格时
1. 无注解
没有对参数添加注解也可以使用,但是不推荐
1.1 代码
User实体类
@Data
@Component
public class User {
private Integer id ;
private String name ;
}
Controller层
@RestController
public class UserController {
@Resource
private User user ;
@GetMapping("/no_annotate")
public User get(Integer id,String name) {
user.setId(id);
user.setName(name);
return user;
}
}
1.2 示例
可见,id与name都没有使用注解
传递空参数时,spring框架将参数设为了默认null值
也可以看到,在传递参数时,也能够正确传递,传递错误的参数也能将其过滤掉
2. @RequestParam注解
这是比较常用的注解
2.1 @RequestParam源码
可以看出该注解一共有三个属性可供选择:
name/value属性:用于指定参数的名称
required:是否需要该参数,默认为需要(true)
defaultValue:参数默认值
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
2.2 示例
2.2.1 示例1
此时两个参数都添加了@RequestParam注解,并且注解属性都为默认值
@RestController
public class UserController {
@Resource
private User user ;
@GetMapping("/requestParam")
public User getByRequestParam(@RequestParam Integer id,@RequestParam String name) {
user.setId(id);
user.setName(name);
return user;
}
}
可见,当添加了该注解之后,required设置为了true,不传参数时,直接报错
可见,当正确传递参数后,能够正确处理
2.2.2 示例2
给参数设置名称
@GetMapping("/requestParam")
public User getByRequestParam(@RequestParam Integer id,@RequestParam(name = "username") String name) {
user.setId(id);
user.setName(name);
return user;
}
可见,该参数名称已经变为了“username",使用”name“传递时发生了错误。
使用”username"传递时,处理成功
3. @RequestBody注解
该注解常用于处理复杂的传参,例如嵌套对象,接收上传的文件或二进制数据
3.1 源码
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
boolean required() default true;
}
该注解的属性只有一个required属性,默认为true,即参数必须传递
3.2 示例
以传递嵌套对象为示例,浏览器传递太麻烦,使用postman发送请求
3.2.1 实体类
@Data
public class Address {
private String city;
private String zipcode;
}
@Data
@Component
public class Admin {
private String name ;
private Address address;
}
3.2.2 Controller层
使用Admin传参,其中一个使用@RequestBody,另一个使用@RequestParam形成对比
@RestController
@RequestMapping("/admin")
public class AdminController {
@Resource
private Admin admin ;
@PostMapping("/requestBody")
public Admin getByRequestBody(@RequestBody Admin admin) {
this.admin.setName(admin.getName());
this.admin.setAddress(admin.getAddress());
return admin;
}
@PostMapping("/requestParam")
public Admin getByRequestParam(@RequestParam Admin admin) {
this.admin.setName(admin.getName());
this.admin.setAddress(admin.getAddress());
return admin;
}
}
3.2.3 发送请求
首先测试@RequestBody注解,发现返回成功
localhost:8081/admin/requestBody
{
"name": "John",
"address": {
"city": "New York",
"zipcode": "10001"
}
}
接着测试@RequestParam,发现返回了400错误。由此可得出,当需要传递复杂数据,例如嵌套对象时,需要使用@RequestBody。
localhost:8081/admin/requestParam
4. @PathVariable注解
当前后端传递参数使用RESTful 风格时,需要采用该注解。
4.1 示例
@RestController
public class UserController {
@Resource
private User user ;
@GetMapping("/user/{id}")
public User getByPath(@PathVariable Integer id) {
user.setId(id);
return user;
}
}