Java LocalDate验证消息和Junit

时间:2019-08-06 06:21:30

标签: java-8

我在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。

2 个答案:

答案 0 :(得分:0)

由于多种原因,这没有意义。

首先,因为YYYY-MM-DD的意思是“周年”,然后是月,然后是“一年中的天”。没有人会以这种格式输入日期。您可能是说yyyy-MM-dd。

第二,因为使用旧的过时的SimpleDateFormatDate类而不是新的,经过深思熟虑的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;
}

有关更多详细信息,请参见答案here,可能是here