继续之前的博客文章有关构造函数和方法参数以及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