繁体   English   中英

java LocalDate 验证消息和 Junit

[英]java LocalDate validation message and Junit

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

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

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

其次,因为使用旧的、过时的SimpleDateFormatDate类而不是新的、经过深思熟虑的java.time包类来解析日期确实是一个奇怪的想法。

最重要的是,因为LocalDate没有格式。 因此,您无法验证 LocalDate 是否具有正确的格式。 LocalDate 不是字符串。 无论您使用何种格式将 String 解析为 LocalDate,最终都会得到 LocalDate,它不记得您使用的原始解析字符串的格式。 就像当你有一个Integer ,你不可能知道输入这个整数的用户是用十进制格式,还是二进制格式,还是十六进制格式。 该解析发生在创建 Integer 之前,并且 Integer 对象仅包含 int 的值,而不包含其在 JSON 结构上的原始格式。

我认为你是在过度考虑你的问题。 您正在尝试编写已经自动为您完成的东西。 首先,您的格式有误-很可能您的意思是“yyyy-MM-dd”-请参阅此处的说明: DateTimeFormatter 其次 - 您需要做的就是:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() {
    return time;
}

有关更多详细信息,请参阅此处的答案,可能在此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM