浅谈@RequestParam 参数是否必须传的问题
一、源码展示
@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括号里的名字是必须的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
相关文章
Springboot 接收POST、json、文本数据的方法 附示例
这篇文章主要介绍了Springboot 接收POST、json、文本数据实践,如果把 json 作为参数传递,我们可以使用 @requestbody 接收参数,将数据直接转换成对象,本文通过示例代码介绍的非常详细,需要的朋友可以参考下2023-10-10Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用
装箱就是把基本类型转换成包装类,拆箱就是把包装类转换成基本类型,下面这篇文章主要给大家介绍Java中自动装箱、自动拆箱与Integer缓存,需要的朋友可以参考下2022-04-04
最新评论