导航

Spring自定义属性编辑器

Posted on 2013-03-28 20:04  曙光城邦  阅读(195)  评论(0编辑  收藏  举报

  自定义属性编辑器主要解决在配置文件中,字符串转换为某种类型的对象的问题。  如applicationContext中配置的字符串14,在类中是整数类型的话会自动匹配转换为整数。

Spring提供了一些常用的属性编辑器,如字符串转日期,数字等。

 自定义属性编辑器:

 1.继承PropertyEditorSupport,重写 getAsText,setAsText方法实现字符串与属性的互相转换。

 2.如果自定义属性编辑器与需要转换的目标类位于同包下,并且名称为 目标类名+Editor,则不需要配置注册,Spring会自己搜索到并注册,否则需要在applicationContext中配置注册。

 

public class School {

    private Teacher teacher;//持有teacher的引用。

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
}
public class Teacher {

    private  String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}

applicationContext中配置School bean

<bean id="school" class="com.zk.School">
    <property name="teacher">
        <value>lisi,25</value>
    </property>
</bean>

即我们需要实现字符串"lisi,25" 转换为一个Teahcer对象。

自定义Teacher属性编辑器:

import java.beans.PropertyEditorSupport;

public class TeacherEditor extends PropertyEditorSupport {

    @Override
    public String getAsText() {//将属性转换为字符串 
        Teacher teacher  = (Teacher)getValue();  //getValue获取当前属性值
        return teacher.getName()+","+teacher.getAge();  //zhangsan,14
    }
    
    
    
    @Override
    public void setAsText(String text) throws IllegalArgumentException {//将字符串转换为属性
        String[] txtArray = text.split(",");
        Teacher teacher = new Teacher();
        teacher.setName(txtArray[0]);
        teacher.setAge(Integer.valueOf(txtArray[1]));
        setValue(teacher);//设置当前的属性
    }
}


由于Teacher类 与 TeacherEditor类在同包下,所以不需要在applicationContext中注册编辑器。 上述代码可以直接使用。

 

否则需要在CustomEditorConfigurer中注册自定义属性编辑器 如:

<!-- 自定义属性编辑器的注册 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="customEditors">
        <map>
            <entry key="com.zk.Teacher">
                <value>com.zk.TeacherEditor222</value>
            </entry>
        </map>
    </property>
</bean>