[英]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.