【问题标题】:java LocalDate validation message and Junitjava LocalDate 验证消息和 Junit
【发布时间】:2019-08-06 06:21:30
【问题描述】:

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

【问题讨论】:

    标签: java-8


    【解决方案1】:

    由于几个原因,这没有意义。

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

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

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

    【讨论】:

    • 感谢您的回复。你能告诉我如何使用新的 java8 日期 API 来实现相同的功能吗?
    【解决方案2】:

    我认为你在考虑你的问题。您正在尝试编写已经自动为您完成的内容。首先,您的格式错误 - 很可能您的意思是“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

    【讨论】:

    • 如果我输入无效日期,我们如何向@JsonFormat 添加自定义错误消息。如果我输入无效日期,例如2019-02-31 然后它打印整个堆栈 strace,所以我如何打印自定义消息,如 Invalid Date。
    • 不确定,但如果是您的代码进行转换,那么您可以捕获异常并打印您想要的任何内容。此外,您可能想研究自定义 JSON 反序列化器,这可能会有所帮助
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2021-12-13
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多