评论

收藏

[Java] 浅谈@RequestParam 参数是否必须传的问题

编程语言 编程语言 发布于:2021-08-16 16:43 | 阅读数:339 | 评论:0

一、源码展示
@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 ValueConstants.DEFAULT_NONE;
}
这是示例代码
@GetMapping("/findById")
  public ResultBean byid(@RequestParam(defaultValue = "1",required = false,/*value = "ss",*/name = "ls") Integer id){
  List<Customers> all = customersService.findById(id);
  return ResultBean.ok(all);
  }
二、说明
2.1 @RequestParam,对于参数入参,这个注解可以不必须有,但只能匹配和你定义的入参,完全一样的名称,对应则匹配,不对应就不匹配。
2.2 required ,是否必须,默认为 true,也就是说,当@RequestParam存在时,是默认required = true条件的,@RequestParam不存在时,返回 2.1 的解释。
2.3 defaultValue ,设置初始值,一般和required = false一起使用,如果不传值,则使用默认值。
2.4 value ,和name,一样,给变量起别名,一一对应于前端传的属性名,映射到后端接口变量名,有时前端无法按要求传给你你所希望的变量名,这个就发挥用处了。
2.5 name ,和value一样,给变量起别名,两个同时存在时,访问时就会出错。
补充:springMVC的@RequestParam是必须滴
先看下代码:
@RequestMapping(value = "/campaigns/{pageNo}/{pageSize}", method = RequestMethod.GET)
public String getList(@PathVariable("pageNo") int pageNo, 
  @PathVariable("pageSize") int pageSize,
  @RequestParam(defaultValue = "0") int status,
  @RequestParam(required=false) String keyword) {
  //....
  return null;
}
1.@RequestParam
在上面代码中,一般情况下@RequestParam不加,方法参数也一样能获取对应绑定的数据,所以很多人都认为@RequestParam是可加可不加的。
直到后来才了解到,Java的反射机制生成的对象并不会保存包含方法的参数,即参数名不会保留在class文件中,所以spring不能反射绑定。
那么问题来了,为什么我们平时都能绑定呢?
这是因为,在Debug模式开启情况下,就能绑定,而我们一般用的eclipse都是默认开启的。
Debug模式下之所以能够绑定,是因为在project–>Properties–>Java Compiler里选中了Add variable attributes to generated class files(used by the debugger)。
要知道,开启Debug模式会影响性能的,所以正式上线的时候,都会关掉的,如果我们没加的话就会报以下错误:
Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….
2.@PathVariable
@PathVariable是用来指定获取@RequestMapping里URL中占位符参数的字段,如上面的@PathVariable(“pageNo”) int pageNo中的pageNo字段就是为了获取{pageNo}这个占位符的值。
@PathVariable括号里的名字必须与占位符的名字一致,而字段名可以不用一样。
如果括号里不指定名字,则在非debug模式下也会遇到1的问题
所以,@PathVariable括号里的名字是必须的。
以上为个人经验,希望能给大家一个参考,也希望大家多多。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/qq_42105629/article/details/97298720

关注下面的标签,发现更多相似文章