淺談@RequestParam 參數(shù)是否必須傳的問題
一、源碼展示
@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,對于參數(shù)入?yún)ⅲ@個注解可以不必須有,但只能匹配和你定義的入?yún)?,完全一樣的名稱,對應(yīng)則匹配,不對應(yīng)就不匹配。
2.2 required ,是否必須,默認為 true,也就是說,當@RequestParam存在時,是默認required = true條件的,@RequestParam不存在時,返回 2.1 的解釋。
2.3 defaultValue ,設(shè)置初始值,一般和required = false一起使用,如果不傳值,則使用默認值。
2.4 value ,和name,一樣,給變量起別名,一一對應(yīng)于前端傳的屬性名,映射到后端接口變量名,有時前端無法按要求傳給你你所希望的變量名,這個就發(fā)揮用處了。
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不加,方法參數(shù)也一樣能獲取對應(yīng)綁定的數(shù)據(jù),所以很多人都認為@RequestParam是可加可不加的。
直到后來才了解到,Java的反射機制生成的對象并不會保存包含方法的參數(shù),即參數(shù)名不會保留在class文件中,所以spring不能反射綁定。
那么問題來了,為什么我們平時都能綁定呢?
這是因為,在Debug模式開啟情況下,就能綁定,而我們一般用的eclipse都是默認開啟的。
Debug模式下之所以能夠綁定,是因為在project–>Properties–>Java Compiler里選中了Add variable attributes to generated class files(used by the debugger)。
要知道,開啟Debug模式會影響性能的,所以正式上線的時候,都會關(guān)掉的,如果我們沒加的話就會報以下錯誤:
Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….
2.@PathVariable
@PathVariable是用來指定獲取@RequestMapping里URL中占位符參數(shù)的字段,如上面的@PathVariable(“pageNo”) int pageNo中的pageNo字段就是為了獲取{pageNo}這個占位符的值。
@PathVariable括號里的名字必須與占位符的名字一致,而字段名可以不用一樣。
如果括號里不指定名字,則在非debug模式下也會遇到1的問題
所以,@PathVariable括號里的名字是必須的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Java接口自動化測試框架設(shè)計之Get請求方法和測試詳解
這篇文章主要介紹了Java接口自動化測試框架設(shè)計 Get請求方法和測試,框架設(shè)計我們只是介紹基本的組件,而且框架設(shè)計沒有想象那么難,一步一步跟著做就會了。這篇我們來演示,如果通過Java代碼來實現(xiàn)一個用純代碼實現(xiàn)Http中的Get請求過程,需要的朋友可以參考下2019-07-07java將文件轉(zhuǎn)成流文件返回給前端詳細代碼實例
Java編程語言提供了強大的文件處理和壓縮能力,下面這篇文章主要給大家介紹了關(guān)于java將文件轉(zhuǎn)成流文件返回給前端的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-07-07java不用循環(huán)語句打印數(shù)組元素的實例
下面小編就為大家?guī)硪黄猨ava不用循環(huán)語句打印數(shù)組元素的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例
這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對象,本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10springMVC幾種頁面跳轉(zhuǎn)方式小結(jié)
本篇文章主要介紹了springMVC 幾種頁面跳轉(zhuǎn)方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java詳細分析講解自動裝箱自動拆箱與Integer緩存的使用
裝箱就是把基本類型轉(zhuǎn)換成包裝類,拆箱就是把包裝類轉(zhuǎn)換成基本類型,下面這篇文章主要給大家介紹Java中自動裝箱、自動拆箱與Integer緩存,需要的朋友可以參考下2022-04-04