繼續之前的博客文章有關構造函數和方法參數以及Java在運行時不保留參數名稱的情況–先前的文章涉及構造函數不保留參數名稱及其對Spring中的Contructor注入的含義,在此我將介紹更多內容不保留參數名稱的情況對Spring有影響:
1.考慮帶參數的Spring MVC Controller方法綁定到傳入的請求參數:
@RequestMapping(value='/members/find')public String getMembersByName(@RequestParam String name){...return 'list';}
在這里,參數“名稱”具有與之關聯的@RequestParam批注,這表明Spring MVC會將請求參數“名稱”綁定到該方法參數。
由于參數名稱在運行時未保留,因此Spring可能會引發異常:
Request processing failed; nested exception is java.lang.IllegalArgumentException: Name for argument type not available, and parameter name i
nformation not found in class file either.
此處的修復很簡單,可以使用調試選項進行編譯,這些調試選項將在運行時保留參數名稱,或者更好的方法是簡單地指示期望的請求參數名稱是什么,作為@RequestParam批注的參數:
@RequestMapping(value='/members/find')
public String getMembersByName(@RequestParam('name') String name){return 'list';
}
2.同樣,考慮另一種Spring MVC控制器方法,這次支持URI模板模式:
@RequestMapping(value='/members/{id}', method=RequestMethod.GET)
public @ResponseBody Member get(@PathVariable Integer id){return this.memberDB.get(id);
}
這里的期望是,如果一個請求的uri為/ members / 20,則id參數將被綁定為20值,但是由于在運行時不保留參數名'id',因此類似在前一種情況下,要么在調試時編譯,要么在@PathVariable批注中明確提及期望的模式名稱:
@RequestMapping(value='/members/{id}', method=RequestMethod.GET)
public @ResponseBody Member get(@PathVariable('id') Integer id){
3.第三個示例是Spring中具有@Cacheable批注的緩存支持。 考慮一個用@Cacheable注釋的示例方法:
@Cacheable(value='default', key='#param1.concat('-').concat(#param2)')
public String cachedMethod(String param1, String param2){return '' + new Random().nextInt();
}
這里的鍵是一個Spring-EL表達式,它指示鍵生成器通過將名稱param1的第一個參數的自變量與名稱為param2的第二個參數的自相結合來生成密鑰。 但是,像以前一樣的問題是這些名稱在運行時不可用。
與以前一樣,修復程序之一是在調試符號打開的情況下進行編譯。 第二種解決方法是使用占位符代替參數索引– a0 OR p0代表第一個參數,a1 OR p1代表第二個參數,依此類推,這樣@Cacheable鍵將如下所示:
@Cacheable(value='default', key='#p0.concat('-').concat(#p1)')
public String cachedMethod(String param1, String param2){return '' + new Random().nextInt();
}
因此,總而言之,使用依賴于方法參數名稱的Spring功能的一種安全方法是使用debug on(javac的-g或-g:var選項)或通過顯式傳遞表示參數名稱的元信息來進行編譯。運行。
參考: all和其他博客中來自我們JCG合作伙伴 Biju Kunjummen的方法參數名稱和Spring 。
翻譯自: https://www.javacodegeeks.com/2012/11/method-parameter-names-and-spring.html