淺談@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括號裡的名字是必須的。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: