文章目录
1.校验对象
1. 1 概览
- 如果有一个Person对象,我们需要校验age>0
class Person{
public int age;
}
- 定义Validator
class PersonValidator implements Validator{
public boolean supports(Class clazz) {
return Person.class.equals(clazz);
}
public voidvalidate(Object obj, Errors e) {
Person p = (Person) obj;
if (p.getAge() < 0) {
e.rejectValue("age", "negativevalue");
}
}
- 使用DataBinder
public static void main(String[] args){
Person person = new Person();
person.age = -1;
PersonValidation personValidation = new PersonValidation();
DataBinder dataBinder = new DataBinder(person);
dataBinder.addValidators(personValidation);
dataBinder.validate();
BindingResult bindingResult = dataBinder.getBindingResult();
System.out.println(bindingResult);
}
1.2 Validator接口
- 实现两个方法
boolean supports(Class<?> clazz);
表示这个Validator是否能够校验指定的clazzvoid validate(Object target, Errors errors);
校验通过supports的对象,并将校验结果放入errors中
1.3 Errors接口
- 储存指定对象的数据绑定和校验错误信息
- 主要方法:
reject(...)
:提交一个错误,可以带参数rejectValue(...)
:提交一个字段的值错误- 其他
getErrorCount()
,hasErrors()
如字面意。
1.4 ValidationUtils
- 两个功能,判空和调用其他Validator
- 调用其他Validator去校验
@Override
public void validate(Object target, Errors errors) {
//自己校验一部分,然后委托其他Validator校验
ValidationUtils.invokeValidator(anotherValidator, target, errors);
}
- 判空
ValidationUtils.rejectIfEmpty();
ValidationUtils.rejectIfEmptyOrWhitespace();
1.5 DataBinder
可以为对象设置属性、校验对象、获取校验结果。
- 主要方法
bind(PropertyValues)
:设置属性addValidators
:添加校验器validate
:校验getBindingResult
:获取绑定结果
1.6 BindingResult
是继承于Errors的接口,添加了获取Errors的一些方法
2. BeanWrapper
2.1 概念
把Bean包裹起来,为对象设置属性
class Person{
Date birth;
String name;
//必须提供getter方法...
}
public static void main(String[] args) {
BeanWrapper beanWrapper = new BeanWrapperImpl(new Person());
beanWrapper.setPropertyValue("birth", new Date());
beanWrapper.setPropertyValue("name", "abc");
System.out.println(beanWrapper.getWrappedInstance());
}
2.2 PropertyEditor
当设置属性时,可以提供转换器,比如Person需要birth为Date类型,如果提供的是String类型,则需要转换
- 自定义PropertyEditor
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
PropertyEditor editor = new PropertyEditorSupport(){
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(simpleDateFormat.parse(text));
}
}
- 在BeanWrapper中注册
beanWrapper.registerCustomEditor(editor);
- 设置时就自动转换了
beanWrapper.setPropertyValue("birth", "2020-6-24 19:16:30");
3. 配置全局的日期和时间格式
@Bean("fcs")
public FormattingConversionService conversionService() {
// Use the DefaultFormattingConversionService but do not register defaults
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);
// Ensure @NumberFormat is still supported
conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory());
// Register JSR-310 date conversion with a specific global format
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
registrar.registerFormatters(conversionService);
return conversionService;
}
- 使用
//String转Date
Date date = conversionService.convert(new Date().toString(), Date.class);