如何在Spring Boot中以“ MM / dd / yyyy”格式验证日期?

问题描述 投票:3回答:3

我需要验证给定的日期具有有效的月份,日期和年份。基本上,日期格式为“ MM / dd / yyyy”。但是日期来了像“ 13/40/2018”,那么我需要抛出一个错误消息,例如“无效的开始日期”。春天有没有可用的注释可完成此任务?

@NotNull(message = ExceptionConstants.INVALID_START_DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM/dd/yyyy")
private Date startDate;
java spring spring-boot spring-annotations
3个回答
2
投票

您可以使用自定义反序列化器:

public class DateDeSerializer extends StdDeserializer<Date> {

    public DateDeSerializer() {
        super(Date.class);
    }

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {
        String value = p.readValueAs(String.class);
        try {
            return new SimpleDateFormat("MM/dd/yyyy").parse(value);
        } catch (DateTimeParseException e) {
            //throw an error
        }
    }

}

并且使用类似:

@JsonDeserialize(using = DateDeSerializer .class)
 private Date startDate;

1
投票

您可以使用类似的东西:

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@JsonFormat(pattern = "MM/dd/yyyy")
private LocalDate startDate;

但是我不知道它是否可以与Date类一起使用>


1
投票
@CustomDateValidator
private LocalDate startDate;

@Documented
@Constraint(validatedBy = CustomDateValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomDateConstraint {
    String message() default "Invalid date format";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class CustomDateValidator implements
  ConstraintValidator<CustomDateConstraint, LocalDate> {

    private static final String DATE_PATTERN = "MM/dd/yyyy";

    @Override
    public void initialize(CustomDateConstraint customDate) {
    }

    @Override
    public boolean isValid(LocalDate customDateField,
      ConstraintValidatorContext cxt) {
          SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
           try
        {
            sdf.setLenient(false);
            Date d = sdf.parse(customDateField);
            return true;
        }
        catch (ParseException e)
        {
            return false;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.