簡體   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