淺談@RequestParam 參數(shù)是否必須傳的問(wèn)題
一、源碼展示
@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);
}
二、說(shuō)明
2.1 @RequestParam,對(duì)于參數(shù)入?yún)?,這個(gè)注解可以不必須有,但只能匹配和你定義的入?yún)?,完全一樣的名稱(chēng),對(duì)應(yīng)則匹配,不對(duì)應(yīng)就不匹配。
2.2 required ,是否必須,默認(rèn)為 true,也就是說(shuō),當(dāng)@RequestParam存在時(shí),是默認(rèn)required = true條件的,@RequestParam不存在時(shí),返回 2.1 的解釋。
2.3 defaultValue ,設(shè)置初始值,一般和required = false一起使用,如果不傳值,則使用默認(rèn)值。
2.4 value ,和name,一樣,給變量起別名,一一對(duì)應(yīng)于前端傳的屬性名,映射到后端接口變量名,有時(shí)前端無(wú)法按要求傳給你你所希望的變量名,這個(gè)就發(fā)揮用處了。
2.5 name ,和value一樣,給變量起別名,兩個(gè)同時(shí)存在時(shí),訪問(wèn)時(shí)就會(huì)出錯(cuò)。
補(bǔ)充: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不加,方法參數(shù)也一樣能獲取對(duì)應(yīng)綁定的數(shù)據(jù),所以很多人都認(rèn)為@RequestParam是可加可不加的。
直到后來(lái)才了解到,Java的反射機(jī)制生成的對(duì)象并不會(huì)保存包含方法的參數(shù),即參數(shù)名不會(huì)保留在class文件中,所以spring不能反射綁定。
那么問(wèn)題來(lái)了,為什么我們平時(shí)都能綁定呢?
這是因?yàn)?,在Debug模式開(kāi)啟情況下,就能綁定,而我們一般用的eclipse都是默認(rèn)開(kāi)啟的。
Debug模式下之所以能夠綁定,是因?yàn)樵趐roject–>Properties–>Java Compiler里選中了Add variable attributes to generated class files(used by the debugger)。
要知道,開(kāi)啟Debug模式會(huì)影響性能的,所以正式上線(xiàn)的時(shí)候,都會(huì)關(guān)掉的,如果我們沒(méi)加的話(huà)就會(huì)報(bào)以下錯(cuò)誤:
Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….
2.@PathVariable
@PathVariable是用來(lái)指定獲取@RequestMapping里URL中占位符參數(shù)的字段,如上面的@PathVariable(“pageNo”) int pageNo中的pageNo字段就是為了獲取{pageNo}這個(gè)占位符的值。
@PathVariable括號(hào)里的名字必須與占位符的名字一致,而字段名可以不用一樣。
如果括號(hào)里不指定名字,則在非debug模式下也會(huì)遇到1的問(wèn)題
所以,@PathVariable括號(hào)里的名字是必須的。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
JAVA使用JDBC技術(shù)操作SqlServer數(shù)據(jù)庫(kù)實(shí)例代碼
本篇文章主要介紹了JAVA使用JDBC技術(shù)操作SqlServer數(shù)據(jù)庫(kù)實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
關(guān)于springboot集成阿里云短信的問(wèn)題
這篇文章主要介紹了springboot集成阿里云短信的方法,本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11
Java實(shí)現(xiàn)猜數(shù)字小游戲代碼
大家好,本篇文章主要講的是Java實(shí)現(xiàn)猜數(shù)字小游戲代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分
這篇文章主要為大家介紹了ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-12-12
IDEA搭建dubbo項(xiàng)目的過(guò)程及存在的問(wèn)題
這篇文章主要介紹了IDEA搭建dubbo項(xiàng)目及存在的問(wèn)題小結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

