方法参数名称和Spring
继续之前的博客文章有关构造函数和方法参数以及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
方法参数名称和Spring相关推荐
- mybatis是什么_为什么SpringMVC可以正确解析方法参数名称,但MyBatis却不行?
对Java字节码有一定了解的朋友应该知道,Java 在编译的时候,默认不会保留方法参数名,因此我们无法在运行时获取参数名称.但是在使用 SpringMVC 的时候,我发现一个奇怪的现象:当我们需要接收 ...
- java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数
在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...
- java反射 获取方法参数名_java 反射借助 asm 获取参数名称最优雅简单的方式
背景说明 最近写反射相关的代码,想获取对应的参数名称,却发现没有特别好的方式. jdk7 及其以前,是无法通过反射获取参数名称的. jdk8 可以获取,但是要求指定 -parameter 启动参数,限 ...
- java1.8中javassist获取接口函数参数名称
前提条件 在java8中要获取类函数参数名称必须在编译时增加参数 编译器时加上-parameters参数 具体内容详见 java1.8获取类和接口函数参数名称 尝试使用javassist获取接口函数名 ...
- jsr 303_使用Spring和JSR 303进行方法参数验证
jsr 303 Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 设定 首先,我们需要通过创建MethodValidation ...
- class? clazz参数_Java如何获取方法参数具体名称?这是个好问题!
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 默认情况下,我们是无法获取方法中参数名称的.通过反射机制,也只能得到参数的顺序以及一些没有意义的变量:arg0.arg1等 ...
- jsr303 spring_使用Spring和JSR 303进行方法参数验证
jsr303 spring Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 建立 首先,我们需要通过创建MethodVali ...
- spring bean依赖_Spring @Configuration并将bean依赖项作为方法参数注入
spring bean依赖 一个春天建议注射豆从Spring的参考指南复制下面的示例中显示之间的相互依存关系的方式在这里 : @Configuration public class AppConfig ...
- 使用Spring和JSR 303进行方法参数验证
Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法. 在这篇文章中,我们将看到如何使用此功能. 设定 首先,我们需要通过创建MethodValidationPostProc ...
最新文章
- 大数据运行环境的运行
- Django models部分,数据库建立,错误解决
- 复制、移动和删除:cp, rm, mv
- 3- 快速上手Linux玩转典型应用- Linux准备工作
- MVC + LigerUI 做后台管理还真是清爽
- h264的码率控制 JVT-G012
- matlab 正交特征向量,怎么对一个矩阵进行对称正交化?? matlab
- 10-9-用户登录控制
- R语言自然语言处理:文本向量化——词嵌入(Word Embedding)
- 132 MySQL多表查询(重要)
- 安卓8.0卡刷杜比音效——magisk模块的安装和使用
- 钉钉企业内微应用对现有系统的免登和消息发送
- MySql定期备份数据到历史表的解决方案
- python-模块使用方法
- 小学生python编程写游戏_小学生开始学Python,开发AI的首选编程语言:推荐一波Python书单...
- 设计幸运大转盘h5小游戏总结
- html 状态栏不显示文字,电脑打字的时候输入法不显示状态栏怎么办?
- 基于帝企鹅算法优化BP神经网络实现数据预测matlab代码
- shell的高级应用-游戏
- 2020年系统集成项目管理工程师考试目标及要求
热门文章
- (转)漫画:什么是分布式事务?
- springmvc sends and receives data by ajax request using json format
- 方法参数的值调用+引用调用+深浅拷贝
- java ldap操作实例_Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法...
- java 方法 示例_Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射...
- java登录界面命令_Java命令行界面(第8部分):Argparse4j
- jhipster_JHipster入门,第2部分
- 操作方法:带有Thymeleaf和Spring Boot的Java 8日期和时间
- spring3.0异步_在Spring 4.2中更简单地处理异步事务绑定事件
- sap寄售退货单_多个退货单