[英]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。
其次,因为使用旧的、过时的SimpleDateFormat
和Date
类而不是新的、经过深思熟虑的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.