浅谈@RequestParam 参数是否必须传的问题
一、源码展示
@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public@interfaceRequestParam{ @AliasFor("name") Stringvalue()default""; @AliasFor("value") Stringname()default""; booleanrequired()defaulttrue; StringdefaultValue()defaultValueConstants.DEFAULT_NONE; }
这是示例代码
@GetMapping("/findById") publicResultBeanbyid(@RequestParam(defaultValue="1",required=false,/*value="ss",*/name="ls")Integerid){ Listall=customersService.findById(id); returnResultBean.ok(all); }
二、说明
2.1@RequestParam,对于参数入参,这个注解可以不必须有,但只能匹配和你定义的入参,完全一样的名称,对应则匹配,不对应就不匹配。
2.2required,是否必须,默认为true,也就是说,当@RequestParam存在时,是默认required=true条件的,@RequestParam不存在时,返回2.1的解释。
2.3defaultValue,设置初始值,一般和required=false一起使用,如果不传值,则使用默认值。
2.4value,和name,一样,给变量起别名,一一对应于前端传的属性名,映射到后端接口变量名,有时前端无法按要求传给你你所希望的变量名,这个就发挥用处了。
2.5name,和value一样,给变量起别名,两个同时存在时,访问时就会出错。
补充:springMVC的@RequestParam是必须滴
先看下代码:
@RequestMapping(value="/campaigns/{pageNo}/{pageSize}",method=RequestMethod.GET) publicStringgetList(@PathVariable("pageNo")intpageNo, @PathVariable("pageSize")intpageSize, @RequestParam(defaultValue="0")intstatus, @RequestParam(required=false)Stringkeyword){ //.... returnnull; }
1.@RequestParam
在上面代码中,一般情况下@RequestParam不加,方法参数也一样能获取对应绑定的数据,所以很多人都认为@RequestParam是可加可不加的。
直到后来才了解到,Java的反射机制生成的对象并不会保存包含方法的参数,即参数名不会保留在class文件中,所以spring不能反射绑定。
那么问题来了,为什么我们平时都能绑定呢?
这是因为,在Debug模式开启情况下,就能绑定,而我们一般用的eclipse都是默认开启的。
Debug模式下之所以能够绑定,是因为在project–>Properties–>JavaCompiler里选中了Addvariableattributestogeneratedclassfiles(usedbythedebugger)。
要知道,开启Debug模式会影响性能的,所以正式上线的时候,都会关掉的,如果我们没加的话就会报以下错误:
Requestprocessingfailed;nestedexceptionisjava.lang.IllegalArgumentException:Nameforargumenttype….
2.@PathVariable
@PathVariable是用来指定获取@RequestMapping里URL中占位符参数的字段,如上面的@PathVariable(“pageNo”)intpageNo中的pageNo字段就是为了获取{pageNo}这个占位符的值。
@PathVariable括号里的名字必须与占位符的名字一致,而字段名可以不用一样。
如果括号里不指定名字,则在非debug模式下也会遇到1的问题
所以,@PathVariable括号里的名字是必须的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。