我在POJO中具有以下属性-
@NotNull(message = "dateOfBirth is required")
@DateFormat(format = "YYYY-MM-DD", message = "dateOfBirth should be in format YYYY-MM-DD")
@JsonDeserialize(using = LocalDateDeserializer.class)
LocalDate dateOfBirth;
对于验证的自定义消息,我在验证器下方添加了
@Documented
@Constraint(validatedBy = DateFormatValidator.class)
@Target( { METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface DateFormat {
String format();
String message() default "Invalid date format";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class DateFormatValidator implements ConstraintValidator<DateFormat, LocalDate> {
private String dateFormat;
@Override
public void initialize(DateFormat constraintAnnotation){
this.dateFormat = constraintAnnotation.format();
}
@Override
public boolean isValid(LocalDate value, ConstraintValidatorContext context) {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
try{
sdf.setLenient(false);
Date d = sdf.parse(String.valueOf(value));
return true;
}catch(ParseException e) {
return false;
}
}
}
现在我要添加我的junit-
.dateOfBirth(LocalDate.of(1984, 03, 12))
但是运行我的junit时,我收到验证器消息,表示 dateOfBirth的格式应为YYYY-MM-DD 。如何将日期传递到我的junit中以满足上述条件,并且应该运行junit。
答案 0 :(得分:0)
由于多种原因,这没有意义。
首先,因为YYYY-MM-DD的意思是“周年”,然后是月,然后是“一年中的天”。没有人会以这种格式输入日期。您可能是说yyyy-MM-dd。
第二,因为使用旧的过时的SimpleDateFormat
和Date
类而不是新的,经过深思熟虑的java.time
包类来解析日期确实是一个奇怪的主意。
最重要的是,因为LocalDate
没有格式。因此,您无法验证LocalDate的格式正确。 LocalDate不是字符串。无论使用哪种格式将String解析为LocalDate,最后都将得到LocalDate,它不会记住您使用的原始解析String的格式。就像拥有Integer
一样,您可能无法知道输入该整数的用户是以十进制格式,二进制还是十六进制格式输入的。解析是在创建Integer之前发生的,并且Integer对象仅包含int的值,而不是JSON结构上的原始格式。
答案 1 :(得分:0)
我认为您在考虑问题。您正在尝试自动编写已经为您完成的工作。首先,您使用了错误的格式-最有可能是您指的是“ yyyy-MM-dd”-请参见此处的说明:DateTimeFormatter。第二-您需要做的只是:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() {
return time;
}