用过SpringMVC框架的小伙伴们都知道,@RequestParam就是用来处理入参的,但可能你会奇怪,平时不使用这个参数也可以获取到参数呀,加与不加都可以获取参数,是这样吗?
1、不添加@RequestParam注解
首先我们创建测试的控制器类,方法中添加一个参数name,此时参数没有添加@RequestParam注解,如下:
启动项目后,通过浏览器访问测试效果,不带参数则获取的参数为null,但页面可以正常显示,请求可以正常的执行,带上参数之后,参数可以正常的获取并打印出来了,如下:
2、添加@RequestParam注解,没有任何注解设置参数
再次启动项目后,通过浏览器访问查看效果,此时带上name参数页面可以正常显示并打印出结果值,但如图所示,不带参数的时候,页面报错,返回400,并提示name不存在,如下:
3、@RequestParam注解参数说明和使用
31、参数required表示该参数是否为必须要提交的,默认为true,即必须要提交的,如果没有提交该参数则会报错;false表示不是必须的,如果没有提交该参数不会报错。
此时参数required=true,name参数提交则正常显示,不提交则会报错,如下:
如果将参数改为required=false,name参数提交则正常显示,不提交则会显示null,不会报错
32、参数defaultValue用来在参数为空的情况下为该参数设置一个默认值,如果参数不为空,则正常获取参数值,如果为空,则参数值为该默认值,如下:
浏览器访问效果如下:
33、参数value是在提交的参数名和方法中接收参数的变量名不一致时使用,如果页面提交的参数名为inputName,而方法中定义的接收参数的变量名为name,此时就用到参数value了,如下:
4、此时我们会发现,@RequestParam注解加与不加参数都能正常获取到,那么接下来我们来修改一个eclipse的配置,再来看一下,修改的配置如下图:
我们将图中标出的这个配置取消勾选,保存修改后再启动项目,在没有添加@RequestParam注解和只是添加了@RequestParam注解,而没有添加注解的value参数时。
你会发现页面会报500错误,而eclipse同样也会报错,结果如下:
eclipse的该设置表示:将变量属性添加到生成的类文件里面;
当然在我们开发阶段不会去修改这些配置,不会出现问题,但是当项目发布到真实环境中,不知道它是如何编译的,配置是否相同,如果不同,那么系统将会出现问题,无法运行。所以为了养成良好的习惯,不给自己埋坑,在开发时将@RequestParam注解写上为好!
标题太长有木有?主要是为了把问题描述清楚,免得进错文章。
昨天测试的同事测试接口的时候,测试出来一个Date类型校验问题。
要求输入的日期格式是:yyyy-MM-dd HH:mm:ss,Vo中使用的注解如下:
测试同事输入下面两种参数都是保存成功,当输入为“202105”参数时,保存的数据变为“1970-01-01 08:03:22”,由此发现这个问题。
常用的三种日期格式化的注解解释如下:
由于 @RequestBody 注解先将json字符串转换成对应的Vo对象,Vo对象中的字段上添加的注解再生效, @DateTimeFormat 只是做格式化,无法做格式校验。
用自定义注解进行json字符串中的日期格式做校验。
解决思路 :
1从request对象中获取原始json字符串入参 。由于自定义注解接口ConstraintValidator的实现获取到的参数值是@RequestBody注解将json字符串参数解析成Vo对象后的Date对象,不是原始json字符串值,所以需要从request中获取json原始参数值;
2获取到json入参原始值使用正则表达式对日期进行格式进行校验 。
温馨提示 :
1由于自定义注解中是无法直接获取到request对象,所以需要按照各自框架获取request对象的方式进行获取。
2获取到的原始json字符串入参可能包含 空格 、 回车 、 换行符 、 制表符 这些特殊字符,所以需要进行特殊字符处理。
3获取Vo对象中添加注解的属性名。
详细见: getFieldName(ConstraintValidatorContext context)即:((ConstraintValidatorContextImpl) context)basePathcurrentLeafNodename
SearchTaskVojava
DateFormatValidationjava
DateFormatValidatorjava
至此问题解决~
文章中有何隐藏问题欢迎留言交流~
有好的解决方案欢迎留言~
一、从注解中获取
使用注解方式,我们需要自定义一个注解,在注解中指定参数名,然后通过反射机制,获取方法参数上的注解,从而获取到相应的注解信息。这里自定义的注解是Param,通过value参数指定参数名,定义了一个工具类ParameterNameUtils来获取指定方法的参数名列表,这里获取测试类ParameterNameTest中定义的方法method1的参数名列表表,下面是具体的代码。
因为现在很少用原始的 servlet api 开发,所以下面说的不对的地方请见谅。
servlet 30开始提供基于注解的开发,这样就可以不要 webxml 了,那么以前那种基于 webxml 的配置参数如何配置呢?
虽然我没用过,但我想,无非就两点:
通过专有的注解配置
按照常规的一般配置方式配置
像这种参数配置,应该更倾向于第2种,就是自己定义一个配置在你要用的地方获取到就是了
这种是可修改的,一般用于:应用配置,用户配置之类的。
而第1种一般用于开发配置,跟代码是强相关的。
当然,也有很多其他的方式可以让你省去自己编写读写配置的麻烦,这个就看你使用的框架环境有没有替你解决了。像常用的 spring 就有非常多的方式 *** 作配置文件了。
其实配置这东西不用想的太复杂,一般默认配置方式是减少编码,只要你知道代码里哪个地方是设置配置参数的,一切都可以由你自己决定。
在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些 *** 作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为>
以上就是关于SpringMVC的@RequestParam注解(eclipse)全部的内容,包括:SpringMVC的@RequestParam注解(eclipse)、@RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验、Java如何获取方法参数中的名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)