【Spring Framework】(3)校验、数据绑定、类型转换

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是否能够校验指定的clazz
  • void 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值