1 概述

javax.validation包与hibernate-validator包中注解能满足大部分需求,但是还是有必要熟悉下自定义数据验证注解,如日期格式验证。

2 添加依赖

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

1.16.20

provided

3 自定义注解

定义一个@DateTime注解

@Target({ElementType.FIELD, ElementType.PARAMETER})

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = DateTimeValidator.class)

public @interface DateTime {

String message() default "格式错误";

String format() default "yyyyMM";

Class>[] groups() default {};

Class extends Payload>[] payload() default {};

}

@Constraint,指定校验类

message,失败提示信息

groups,分组验证(后面介绍)

payload,不知道,欢迎留言探讨

4 实现具体验证类

public class DateTimeValidator implements ConstraintValidator {

private DateTime dateTime;

@Override

public void initialize(DateTime dateTime) {

this.dateTime = dateTime;

}

@Override

public boolean isValid(String value, ConstraintValidatorContext context) {

// 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离

if (value == null) {

return true;

}

String format = dateTime.format();

if (value.length() != format.length()) {

return false;

}

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);

try {

simpleDateFormat.parse(value);

} catch (Exception e){

return false;

}

return true;

}

}

实现ConstraintValidator接口,定义initialize和isValid方法。

initialize,主要用于初始化,它可以获得当前注解的所有属性

isValid,进行约束验证的主体方法,其中 value 就是验证参数的具体实例,context 代表约束执行的上下文环境。

5 实体类

@Data

public class User {

@NotNull(message = "名字不能为空")

@Length(min = 4, max = 10, message = "name 长度必须在 {min} - {max} 之间")

private String name;

@NotNull(message = "生日不能为空")

@DateTime(format = "yyyyMMdd", message = "格式错误,正确格式为:yyyyMMdd")

private String birthday;

}

6 控制层

@RestController

public class UserController {

@PostMapping("/user")

public R addUser(@Validated @RequestBody User user, BindingResult br) {

if (br.hasErrors()) {

return R.isFail().msg(br.getFieldError().getDefaultMessage());

} else {

return R.isOk().data(user);

}

}

}

7 测试结果

8 工程目录

9 结束语

说点什么呢,有任何建议,欢迎留言探讨,本文源码。

欢迎关注博主公众号,第一时间推送最新文章

java注解定义时间格式_SpringBoot基础教程2-1-8 数据验证-自定义日期格式验证相关推荐

  1. java swing(GUI图形化界面)基础教程3-添加事件监听1

    学习此内容前建议先去学习java基础知识: 匿名内部类 (学的多的可以用lambda表达式,更加简便) 好, 我们先看一下之前的代码(即一个窗口和一个按钮) 如果想看详细内容,链接为: (23条消息) ...

  2. 前端图片有时候能显示有时候不显示_web前端基础教程:两种数据存储思路

    Web前端开发基础,Web前端基础教程 数据存储是数据流在加工过程中产生的临时文件或加工过程中需要查找的信息.数据以某种格式记录在计算机内部或外部存储介质上.数据存储要命名,这种命名要反映信息特征的组 ...

  3. POI对Excel自定义日期格式的读取

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel Java代码   private List<String[]> rosolveFile(InputStream i ...

  4. vue过滤器,日期自动减一天,返回一个自定义日期格式

    今天写了一个日期自动减去一天的过滤器,然后返回一个自定义的日期格式,下面是代码 Vue.filter("formatPeriods", function (date) {//传进来 ...

  5. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  6. java 注解入门 简书_Java基础-注解

    注解是什么? Java注解(Annotation)又称为Java标注.可以从字面的意思理解它,其实就是一个标注.他可以根据定义作用于不同的地方.注解对他们注解的代码没有直接影响.注解是JDK 5中引入 ...

  7. java 时间格式 外语,java-如何使用ERA设置日语的英语日期格式

    搜索热词 我希望新的日语ERA日期为" R010501",而我却得到" R151". 我正在使用com.ibm.icu.text.DateFormat包来获取日 ...

  8. Spring Cloud Alibaba基础教程:Nacos的数据持久化

    <Spring Cloud Alibaba基础教程>连载中,关注我一起学习!前情回顾: <使用Nacos实现服务注册与发现> <支持的几种服务消费方式> <使 ...

  9. Spring Cloud Alibaba基础教程:Nacos的数据持久化 1

    前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式> ...

最新文章

  1. java绘图之Graphics类
  2. cocos2d-js中Hello World代码分析
  3. 一张贴纸骗过AI识别?对抗性机器学习是什么东西?
  4. 3.4 svm人脸识别
  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流...
  6. res_config_mysql和chan_sip模块的加载分析
  7. C++学习之路 | PTA乙级—— 1083 是否存在相等的差 (20 分)(精简)
  8. 百度搜索引擎优化指南3.0_深圳网站搜索引擎排名优化电话,百度优化排名费用_华阳网络...
  9. DZ论坛系统 UC_KEY拿webshell
  10. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第三篇
  11. 属马的人性格有什么缺点和优点?
  12. 【java】窗口和流的应用
  13. respond是空的_httpClient 获取response 中的 content 为空的原因(急求)
  14. java B2B2C 源码 多级分销Springcloud多租户电子商城系统-Spring Cloud eureka
  15. pdf在线浏览器pdf viewer
  16. 如何彻底删除adobe?adobe官方清理工具怎么用?
  17. swoole安装教程人人商城互动直播通信服务启用教程
  18. 第5章 SIM卡锁定PIN解锁流程
  19. Python将word表格存入excel —— 格式化pg参数手册
  20. 搜狗输入html,搜狗输入法:回家的路

热门文章

  1. MongoDB索引实战技巧
  2. 行千里,看山城轻轨穿楼越林;致广大,望重庆交通桥上桥下
  3. 从 Ubuntu 21.04 升级到 Ubuntu 21.10
  4. ubuntu21.04截图快捷键
  5. operator-sdk安装脚本整理
  6. Go gin框架:helloworld
  7. hdfs写数据流程分析
  8. linux cp -d复制软链接文件
  9. Python Django 使用cookie实现三天免登录及记住密码功能代码示例
  10. Centos7安装netstat及简单使用