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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@RequestBody接收Json参数 用自定义注解对Vo对象中Date类型日期格式校验相关的知识,希望对你有一定的参考价值。

参考技术A

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

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

SearchTaskVo.java

DateFormatValidation.java

DateFormatValidator.java

至此问题解决~
文章中有何隐藏问题欢迎留言交流~
有好的解决方案欢迎留言~

以上是关于@RequestBody接收Json参数 用自定义注解对Vo对象中Date类型日期格式校验的主要内容,如果未能解决你的问题,请参考以下文章

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

springMVC绑定json参数之一

用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据

记录下httpclient 发送请求 服务端用@RequestBody 自动接收参数 报415

关于@RequestBody 有的时候能接收有的时候接收不了的情况,@RequestParam什么时候使用

深入理解Spring系列之十一:SpringMVC-@RequestBody接收json数据报415