我需要验证给定的日期具有有效的月份,日期和年份。基本上,日期格式为“ MM / dd / yyyy”。但是日期来了像“ 13/40/2018”,那么我需要抛出一个错误消息,例如“无效的开始日期”。春天有没有可用的注释可完成此任务?
@NotNull(message = ExceptionConstants.INVALID_START_DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM/dd/yyyy")
private Date startDate;
您可以使用自定义反序列化器:
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;
您可以使用类似的东西:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@JsonFormat(pattern = "MM/dd/yyyy")
private LocalDate startDate;
但是我不知道它是否可以与Date
类一起使用>
@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;
}
}
}