随笔 - 832  文章 - 2  评论 - 31  阅读 - 167万

SpringBoot自定义校验注解校验日期时间格式字符串

1 概述

后台单独对接收到的参数进行验证时比较麻烦,springboot项目的web组件(spring-boot-starter-web)集成了hibernate-validator,开发者可以直接使用hibernate-validator提供的注解对数据进行校验,当有一些复杂的参数校验时我们也可以自定义校验注解

2、先定义一个注解

复制代码
package com.ideatech.ams.ws.validate;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = DateTimeValidator.class)
public @interface DateTimeStr {

    String message() default "{javax.validation.constraints.DateTimeStr.message}";


    String format() default "yyyy-MM-dd HH:mm:ss";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
复制代码

   @Constraint,指定校验类
    message,失败提示信息
    groups,分组验证(后面介绍)
    payload,不知道,欢迎留言探讨

2、编写校验类

复制代码
package com.ideatech.ams.ws.validate;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
import java.text.SimpleDateFormat;

public class DateTimeValidator implements ConstraintValidator<DateTimeStr,String>{

    private  DateTimeStr  dateTimeStr;


    @Override
    public void initialize(DateTimeStr dateTimeStr) {
        this.dateTimeStr=dateTimeStr;
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 如果 value 为空则不进行格式验证,为空验证可以使用 @NotBlank @NotNull @NotEmpty 等注解来进行控制,职责分离
        if (value == null) {
            return true;
        }
        String format = dateTimeStr.format();

        if (value.length() != format.length()) {
            return false;
        }

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);

        try {
            simpleDateFormat.parse(value);
        } catch (Exception e){
            return false;
        }


        return true;
    }
}
复制代码

1:必须实现ConstraintValidator接口

2:实现了ConstraintValidator接口后即使不进行Bean配置,spring也会将这个类进行Bean管理

3:可以在实现了ConstraintValidator接口的类中依赖注入其它Bean

4:实现了ConstraintValidator接口后必须重写 initialize 和 isValid 这两个方法;initialize方法主要来进行初始化,通常用来获取自定义注解的属性值;isValid 方法主要进行校验逻辑,返回true表示校验通过,返回false表示校验失败,通常根据注解属性值和实体类属性值进行校验判断

    /**
     * 银行通知客户临柜时间(必填)
     */
    @NotBlank(message="银行通知客户临柜时间不能为空")
    @DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式错误,正确格式为:yyyy-MM-dd HH:mm:ss")
    private String bankApplyTime;

 

posted on   小破孩楼主  阅读(6335)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示