JavaBean 编辑器
概述
java.beans.PropertyEditor
接口定义了设置 JavaBean 属性的方法java.beans.BeanInfo
接口描述了 JavaBean 哪些属性是可定制的,描述了可定制属性与PropertyEditor 接口的对应关系,每一个属性对应一个属性描述器 PropertyDescriptorjava.beans.PropertyEditorManager
负责管理默认属性编辑器。内部保存一些常见类型的属性编辑器
PropertyEditor 属性编辑器接口
- PropertyEditor 规定了将外部设置值转换为内部 JavaBean 属性值的转换接口方法,主要方法如
方法 | 描述 |
---|
void setValue(Object value) | 设置属性的值 |
Object getValue() | 返回属性的当前值 |
String getAsText() | 将属性对象用一个字符串表示 |
void setAsText(String text) | 用一个字符串去更新属性的内部值,这个字符串一般从外部属性编辑器传入 |
- 实现类 PropertyEditorSupport,一般情况下用户自定义可以扩展这个类
Spring 的属性编辑器
在 Spring 配置文件中,通过字面值为 Bean 各种类型的属性提供设置值,不管是int还是double,在配置文件中都对应字符串类型的字面值。BeanWrapper 在填充 Bean 属性时,使用属性编辑器将字面值正确的转换为对应的内部类型
Spring 为常见的属性类型提供了默认的属性编辑器。BeanWrapperImpl 类扩展了 PropertyEditorRegistrySupport 类。PropertyEditorRegistrySupport 类为常见属性类型提供默认的属性编辑器
PropertyEditorRegistrySupport
- PropertyEditorRegistrySupport 中常见类型,分为三类(核心在其 createDefaultEditors 方法中)
类别 | 描述 |
---|
基础数据类型 | 分为几个小类:基本数据类型(boolean、int)、基础数据类型封装类(Long、Integer)、基本类型的数组(char[]、byte[])、大数类(BigDecimal、BigInteger) |
集合类型 | 5中集合类(Collection、Set、SortedSet、List、SortedMap) |
资源类型 | 用于访问外部资源的常见类(Class、Class[]、File、InputStream、Locale等) |
- 两个属性
属性 | 描述 |
---|
Map<Class<?>, PropertyEditor> defaultEditors | 保存默认属性类型的编辑器,key-属性类型、value-属性编辑器实例 |
Map<Class<?>, PropertyEditor> customEditors | 保存用户自定义的属性编辑器 |
自定义属性编辑器
- 继承
java.beans.PropertyEditorSupport
,如CustomDateEditor、CustomNumberEditor等
class CustomEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
String[] split = text.split(",");
Person person = new Person();
person.setName(split[0]);
person.setAge(split[1]);
setValue(person);
}
}
- 注册自定义属性编辑器
org.springframework.beans.factory.config.CustomEditorConfigurer
<!--注册自定义的属性编辑器-->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<!--属性编辑器对应的属性类型-->
<entry key="com.learning.spring.optimaze.property.editor.PropertyEditor.Person"
value="com.learning.spring.optimaze.property.editor.PropertyEditor.CustonEditor"/>
</map>
</property>
</bean>
- SpringMVC 中属性编辑器使用
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-mm-dd"), true));
}
/**
* 初始化数据绑定
* 1. 将所有传递进来的String进行HTML编码,防止XSS攻击
* 2. 将字段中Date类型转换为String类型
*/
@InitBinder
protected void initBinder(WebDataBinder binder) {
// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
}
@Override
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
});
// Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(DateUtils.parseDate(text));
}
});
}
参考
- 源码地址
![Fork me on Gitee](https://gitee.com/Learning-sam/Learning-Spring/widgets/widget_6.svg)