@RequestParam 注解的使用

1. @RequestParam 注解的作用

@RequestParam 是 Spring MVC 框架中用于将 HTTP 请求参数绑定到控制器(Controller)方法参数的注解。它主要用于提取请求中的查询参数(如 ?name=value)、表单参数或 multipart/form-data 中的参数,并将其自动转换为方法参数所需的类型。

总结来看,主要作用有:

  1. 参数绑定:从请求中获取指定名称的参数值,并注入到方法参数中。
  2. 类型转换:Spring 会利用内置的转换器将字符串参数转换为方法参数声明的类型(如 intLongDate 等)。
  3. 参数验证:与 Bean Validation 结合,可以对参数进行校验。
  4. 可选性控制:通过 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";
}
  1. namevalue :指定请求参数的名称。如果不指定,则默认使用方法参数名。注意:从源码中可以看到,name 的别名是 value,value 的别名是 name,两者是等价的。
  2. required:是否必须,默认为 true。若为 false,参数缺失时值为 null 或空值(取决于类型)。
  3. 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. 总结

  1. @RequestParam 是 Spring MVC 框架中用于将 HTTP 请求参数绑定到控制器(Controller)方法参数的注解。
  2. 可以使用 name 或者 value 指定参数名,如果不填,默认使用方法的参数名
  3. @RequestParam 既可以接收 Get 请求,也可以接收 Post 请求