@Past仅支持日期和日历,但不支持字符串,因此没有日期格式的概念.
您可以创建一个自定义约束,例如@DateFormat,它可以确保给定的字符串符合给定的日期格式,并使用如下约束实现:
public class DateFormatValidatorForString
implements ConstraintValidator {
private String format;
public void initialize(DateFormat constraintAnnotation) {
format = constraintAnnotation.value();
}
public boolean isValid(
String date,
ConstraintValidatorContext constraintValidatorContext) {
if ( date == null ) {
return true;
}
DateFormat dateFormat = new SimpleDateFormat( format );
dateFormat.setLenient( false );
try {
dateFormat.parse(date);
return true;
}
catch (ParseException e) {
return false;
}
}
}
请注意,SimpleDateFormat实例不能存储在验证程序类的实例变量中,因为它不是线程安全的.或者,您可以使用commons-lang项目中的FastDateFormat类,它可以安全地从多个线程并行访问.
如果你想为@Past添加对字符串的支持,你可以通过实现一个实现ConstraintValidator< Past,String>的验证器来实现.并使用XML constraint mapping进行注册.但是,无法指定预期的格式.或者,您可以实现另一个自定义约束,例如@PastWithFormat.