Bläddra i källkod

jdk 模块添加验证时间日期的 @DateVerify 注解

reghao 1 månad sedan
förälder
incheckning
5258ef1678

+ 35 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/web/validator/DateVerify.java

@@ -0,0 +1,35 @@
+package cn.reghao.jutil.jdk.web.validator;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+
+import java.lang.annotation.*;
+
+/**
+ * 日期时间类型校验注解
+ *
+ * @author reghao
+ * @date 2026-01-09 17:28:42
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Constraint(validatedBy = {DateVerifyValidator.class}) // 指定自定义的校验器
+public @interface DateVerify {
+
+    // 提示信息
+    String message() default "日期格式不正确";
+
+    // 日期时间格式
+    String dateFormat() default "yyyy-MM-dd HH:mm:ss";
+
+    /**
+     * 必须包含以下两个属性
+     * 否则会报错 error msg: contains Constraint annotation, but does not contain a groups parameter.
+     *
+     * @return
+     */
+    Class<?>[] groups() default {};
+
+    Class<? extends Payload>[] payload() default {};
+}

+ 52 - 0
jdk/src/main/java/cn/reghao/jutil/jdk/web/validator/DateVerifyValidator.java

@@ -0,0 +1,52 @@
+package cn.reghao.jutil.jdk.web.validator;
+
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+/**
+ * 日期时间类型校验器
+ *
+ * @author reghao
+ * @date 2026-01-09 17:29:25
+ */
+public class DateVerifyValidator implements ConstraintValidator<DateVerify, String> {
+    private String dateFormat;
+
+    @Override
+    public void initialize(DateVerify obj) {
+        dateFormat = obj.dateFormat();
+    }
+
+    /**
+     * 对参数进行验证
+     *
+     * @param value   修饰字段的值
+     * @param context 上下文
+     * @return true:验证通过, false:验证不通过
+     */
+    @Override
+    public boolean isValid(String value, ConstraintValidatorContext context) {
+        return !value.isBlank() && isValidDate(value, dateFormat);
+    }
+
+    boolean isValidDate(String str, String dateFormat) {
+        boolean convertSuccess = true;
+        if (null != str && null != dateFormat && str.length() == dateFormat.length()) {
+            SimpleDateFormat format = new SimpleDateFormat(dateFormat);
+            try {
+                // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
+                format.setLenient(false);
+                format.parse(str);
+            } catch (ParseException e) {
+                convertSuccess = false;
+            }
+        } else {
+            convertSuccess = false;
+        }
+
+        return convertSuccess;
+    }
+}