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

网友投稿 1273 2023-02-09

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

浅谈@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 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不加,方法参数也一样能获取对应绑定的数据NBgVDPQwO,所以很多人都认为@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 pagehttp://No中的pageNo字段就是为了获取{pageNo}这个占位符的值。

@PathVariable括号里的名字必须与占位符的名字一致,而字段名可以不用一样。

如果括号里不指定名字,则在非debug模式下也会遇到1的问题

所以,@Pahttp://thVariable括号里的名字是必须的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:@RequestParam使用defaultValue属性设置默认值的操作
下一篇:网络安全是属于前端吗(网络安全是属于前端吗对吗)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~