1. @RequestParam 注解的作用
@RequestParam 是 Spring MVC 框架中用于将 HTTP 请求参数绑定到控制器(Controller)方法参数的注解。它主要用于提取请求中的查询参数(如 ?name=value)、表单参数或 multipart/form-data 中的参数,并将其自动转换为方法参数所需的类型。
总结来看,主要作用有:
- 参数绑定:从请求中获取指定名称的参数值,并注入到方法参数中。
- 类型转换:Spring 会利用内置的转换器将字符串参数转换为方法参数声明的类型(如
int、Long、Date等)。 - 参数验证:与 Bean Validation 结合,可以对参数进行校验。
- 可选性控制:通过
required属性指定参数是否必须存在,如果缺失且未设置默认值,则抛出异常。
2. 参数详解
@RequestParam 注解的源码为:
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";
}
name或value:指定请求参数的名称。如果不指定,则默认使用方法参数名。注意:从源码中可以看到,name 的别名是 value,value 的别名是 name,两者是等价的。required:是否必须,默认为true。若为false,参数缺失时值为null或空值(取决于类型)。defaultValue:当参数缺失或为空字符串时,使用的默认值。设置此属性时,required自动变为false
3. 使用方法
3.1. 提取请求中的查询参数
直接上代码:
@RestController
@RequestMapping("/test")
public class DemoParamController {
@RequestMapping("/param")
public String testRequestParam(@RequestParam(value="name") String userName) {
System.out.println(userName);
return "OK";
}
}
请求的时候使用:“127.0.0.1:8080/test/param?name=hello world”,服务端会自动提取出 name 字段。如果参数不指定,则默认使用方法参数名,如下:
@RestController
@RequestMapping("/test")
public class DemoParamController {
@RequestMapping("/param")
public String testRequestParam(@RequestParam String name) {
System.out.println(name);
return "OK";
}
}
注意:这里的使用方法参数名需要与请求的时候保持一致,不然会报错:org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter ‘userName’ for method parameter type String is not present
3.2. required 参数的使用
要想屏蔽这个报错,可以使用参数 required = false,这样如果请求中不存在指定的参数,会设置为 null 或空值:
@RestController
@RequestMapping("/test")
public class DemoParamController {
@RequestMapping("/param")
public String testRequestParam(@RequestParam(required = false) String userName) {
System.out.println(userName);
return "OK";
}
}
3.3. 获取表单数据
如前端请求的表单数据是 file ,且是一个文件,后端的处理流程是:
@RestController
@RequestMapping("/test")
public class DemoParamController {
@RequestMapping("/param")
public String testRequestParam(@RequestParam(name="file") MultipartFile inputFile) {
System.out.println(inputFile.getOriginalFilename());
return "OK";
}
}
也可以接收其他类型的表单数据,如:
@RestController
@RequestMapping("/test")
public class DemoParamController {
@PostMapping("/param")
public String testRequestParam(@RequestParam String name) {
System.out.println(name);
return "OK";
}
}
4. 总结
@RequestParam是 Spring MVC 框架中用于将 HTTP 请求参数绑定到控制器(Controller)方法参数的注解。- 可以使用
name或者value指定参数名,如果不填,默认使用方法的参数名 @RequestParam既可以接收 Get 请求,也可以接收 Post 请求