数据绑定是将请求中的信息转换为Handler方法中的参数。在这个过程中包含请求信息的校验,数据类型的转换,数据格式的转换。
1、数据校验
mvc使用的数据校验是spring的校验功能,它支持三种形式
- 调用DataBinder对象的validator方法,mvc中为WebDataBinder
- 实现Validator接口,注册实现类。
- 使用JSR-303规范,hibernate validator是它的一种典型实现。
第三种方式最常用,参考hibernate validator的官网,校验的结果通过Handler方法的Errors,BindingResult参数获取
2、数据转换
数据转换也是spring的功能,它分为以下两种情形:
- 字符串转换为对象,实现PropertyEditor接口,或者直接继承PropertyEditorSupport类,从字符串----->对象,实现setAsText。从对象------->字符串,实现getAsText。可以参考BooleanEditor。
- 对象转换为对象,又分为几种情形,参考spring的Converter, ConverterFactory接口。
3、数据格式
数据格式化也是spring的功能,Formatter接口实现了Printer接口和Parser接口,Printer接口是将对象格式化为字符串,Parser接口是将特定格式的字符串转换为对象。参考spring的Formatter。
4、注册方式
在spring中要使用校验器,格式化器,转换器,需要在spring的配置文件中配置,在mvc中可以通过WebDataBinder的API注册校验器,格式化器,转换器。
代码如下:
@InitBinder public void initBinder(WebDataBinder binder) { // 添加校验器,通常使用hibernate validator,基本不使用spring的validator接口 binder.addValidators(validators); // 添加propertyEditor,字符串与对象之间的相互转换, // requiredType为对象类型, propertyEditor为PropertyEditor接口的实现类 binder.registerCustomEditor(requiredType, propertyEditor); // 添加转换器 ConversionServiceFactoryBean service = new ConversionServiceFactoryBean(); service.setConverters(converters); binder.setConversionService(service.getObject();); // 添加格式化器 binder.addCustomFormatter(formatter); }
注册方法通常是全局的,所以@initBinder方法通常放在@ControllerAdvice或@RestControllerAdvice标注的Controller类中(本质是切面)。