我们工作中经常需要日期格式进行定义,如果客户端传来的日期字符串不符合要求,那么根本无法保存,但是已有的注解没有日期格式的验证,那我们自己实现一个

一、自定义日期格式验证注解@DateFormat

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author: LiuXingJie
 * @Description:
 * @Date Create in 9:32 2023/12/1
 * @Modified By:
 */
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = DateFormatValidator.class)
public @interface DateFormat {
    String message() default "日期格式错误";

    String format() default "yyyy-MM-dd";

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

    Class<? extends Payload&gt;[] payload() default {};
}

二、验证逻辑处理

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

/**
 * @Author: best_liu
 * @Description:
 * @Date Create in 9:32 2023/12/1
 * @Modified By:
 */
public class DateFormatValidator implements ConstraintValidator<DateFormat, String&gt; {

    private DateFormat dateFormat;

    @Override
    public void initialize(DateFormat dateFormat) {
        this.dateFormat = dateFormat;
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        String format = dateFormat.format();
        if (format.equals("yyyy-MM")) {
            DateTimeFormatter dtf1 = new DateTimeFormatterBuilder()
                    .appendPattern(format)
                    .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
                    .toFormatter();
            try {
                LocalDate.parse(s, dtf1);
            } catch (Exception e) {
                return false;
            }
        } else {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
            try {
                simpleDateFormat.parse(s);
            } catch (Exception e) {
                return false;
            }
        }
        return true;
    }
}

这个月数据yyyy-MM需要特殊处理原因在于,如果提供的是yyyy-MM-dd的格式的字符串使用SimpleDateFormat(“yyyy-MM”)去解析也不会失败

三、自定义注解应用

@ApiModelProperty("化验时间")
    @NotBlank(message = "assayTime是必填项")
    @DateFormat(format = "yyyy-MM-dd HH:mm:ss",message = "日期格式错误正确格式为yyyy-MM-dd HH:mm:ss")
    private String assayTime;

四、controller层的使用 

然后controller方法中用@RequestBody表示这个参数接收的类

@PostMapping("/save")
    @RequiredLog(methodType="1")
    public AjaxResult save(@RequestBody @Validated ProcessQualityAlarm processQualityAlarm) {

        return processQualityAlarmService.saveInfo(processQualityAlarm);
    }

五、最终效果

六、SpringBoot关于List集合校验

 1、针对List集合的校验有两种方案

1)在controller上添加@Validated

2)则集合校验变成如下方式

 3)QualityAlarmVo如下

@Data
public class QualityAlarmVo {
    @NotBlank(message = "assayTime是必填项")
    @DateFormat(format = "yyyy-MM-dd HH:mm:ss",message = "日期格式错误,正确格式为yyyy-MM-dd HH:mm:ss")
    private String assayTime;
    @NotBlank(message = "factoryArea是必填项")
    private String factoryArea;
    @NotBlank(message = "qualityPositionName是必填项")
    private String qualityPositionName;
    @NotEmpty
    private List<@NotNull @Valid ProcessQualityAlarm> list;
}

4)效果

原文地址:https://blog.csdn.net/askuld/article/details/134727109

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_27604.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注