1.文件配置
从上一节中,我们看到的错误信息的提示都是固定,我们需要是提示信息转换我们想要的信息。这个实现,首先需要我们在src/main/resource下定义messages.properties的文件。这个文件不仅仅是信息配置的信息,同时也是国际化可以配置的地方,我们在稍后的章节中将会学习到国际化。现在我们在messages.properties的文件中添加的信息如下。
Size.profileForm.twitterHandle=Please type in your twitter user name
Email.profileForm.email=Please specify a valid email address
NotEmpty.profileForm.email=Please specify your email address
PastLocalDate.profileForm.birthDate=Please specify a real birth date
NotNull.profileForm.birthDate=Please specify your birth date
typeMismatch.birthDate = Invalid birth date format.
Spring的框架中的类DefaultMessageCodesResolver 将会负责去转换错误的信息提示。这个错误信息的配置规格要遵守如下的形式:
• code + "." + object name + "." + field
• code + "." + field
• code + "." + field type
• code
当然除了上面用的配置文件来处理错误信息,我们也可以直接在类中填写,比如:
@Size(min = 2, message = "Please specify a valid twitter handle")
private String twitterHandle;
2.日期范围处理
在Java的日期处理中,我们有一个@past的注解,这个确保日期是过去的时期。我们不想用户输入的生日日期是将来某个时间的,这个也是不合理的。所以我们需要自己定义处标签,用于日期的处理。一样的,我们在date包下定义个标签名为PastLocalDate.
package masterSpringMVC.date;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.time.LocalDate;
/**
* 用户的生日时间处理,输入日期必须是过去的某个时间
* Created by OwenWilliam on 2016/5/15.
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PastLocalDate.PastValidator.class)
@Documented
public @interface PastLocalDate {
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default{};
class PastValidator implements ConstraintValidator<PastLocalDate,
LocalDate> {
public void initialize(PastLocalDate past) {
}
//判断日期是否是空或是否是过去的
public boolean isValid(LocalDate localDate,
ConstraintValidatorContext context) {
return localDate == null || localDate.isBefore(LocalDate.
now());
}
}
}
上面的这个方法太简单了,最后我们需要在ProfileForm的birthDate字段添加这个标签。
@NotNull
@PastLocalDate
private LocalDate birthDate;
3.总结
在这一章节中,我们实现了错误信息提示可以动态变化,就是配置在文件中。同时,我们也做了生日日期的限制处理,日期的输入不能为将来和某个时间点。这样我们的profilePage的视图就相对完善了许多了。不过,我们已经的前面对日期处理时,有过这样的问题,不同国家的格式是不一样的,所以我们的系统需要支持国际。下一节中,我们将会讲国际化。
源码路径:git@github.com:owenwilliam/masterSpringMVC.git