@RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验

@RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验,第1张

标题太长有木有?主要是为了把问题描述清楚,免得进错文章。

昨天测试的同事测试接口的时候,测试出来一个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

至此问题解决~

文章中有何隐藏问题欢迎留言交流~

有好的解决方案欢迎留言~

其实就是参考的@RequestBody注解来实现,@JsonParam可以看着为轻量级的获取Json参数的自定义实现注解。

因为流只能读取一次,所以需要在第一次读取的时候,将解析的对象存入ThreadLocal中,以便于多次使用@JsonParam来进行解析。

SpringBoot2x之HandlerMethodArgumentResolver实战

SpringBoot2x之HandlerMethodArgumentResolver(2)—自定义解析器顺序

通常,笔者在所有项目中都会启用 JRebel for Android。这是一个 Android Studio 的插件。“启用它”基本上意味着,只需点击一下自定义按钮就能运行应用,其余所有工作都交给它了。JRebel for Android 对安卓开发者来说是一款提升效率的工具

在详@ResponseBody和@RequestBody注解之前,我们先了解一下@RequestMapping注解,@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法。例如,

其对应的相对请求路径就是hello/first,访问该路径就会跳转到hello everyone页面。

2 注解详述

@Responsebody注解表示该方法的返回的结果直接写入 >

以上就是关于@RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验全部的内容,包括:@RequestBody接收Json参数 | 用自定义注解对Vo对象中Date类型日期格式校验、SpringBoot2.x之HandlerMethodArgumentResolver(3)—取代@RequestBody注解来获取Json参数、使用retrofit2怎么获取requestbody等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/9799364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存