`

spring中自定义属性编辑器CustomEditorConfigurer

阅读更多
什么是属性编辑器,作用?
* 自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器

* 如何定义属性编辑器?
* 继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java
* 将属性编辑器注册到spring中,参见:applicationContext.xml

比如:
有一个类里面有一个Date属性
public class Bean1 {
     private Date dateValue;
     public void setDateValue(Date dateValue) {
		this.dateValue = dateValue;
	}
}

applicationContext.xml配置文件如下:
<!--将bean1中的Date赋值2008-08-15,spring会认为2008-08-15是String,无法转换成Date,会报错!-->
<bean id="bean1" class="com.bjsxt.spring.Bean1">
      <property name="dateValue">
		 <value>2008-08-15</value>
	</property>
</bean>
<!-- 于是定义属性编辑器 -->      
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	<property name="customEditors">
		<map>
			<entry key="java.util.Date">
				<bean class="com.bjsxt.spring.UtilDatePropertyEditor">
                                        <!--干脆把format也注入,灵活处理格式-->
					<property name="format" value="yyyy-MM-dd"/>
				</bean>
			</entry>
		</map>
	</property>
</bean>	

UtilDatePropertyEditor.java 如下,必须继承java.beans.PropertyEditorSupport类,覆写setAsText()方法
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * java.util.Date属性编辑器 
 * @author Administrator
 *
 */
public class UtilDatePropertyEditor extends PropertyEditorSupport {

	private String format="yyyy-MM-dd";
	
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		System.out.println("UtilDatePropertyEditor.saveAsText() -- text=" + text);
		
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			Date d = sdf.parse(text);
			this.setValue(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public void setFormat(String format) {
		this.format = format;
	}

}


这样就可以完成正确解析了,注意customEditors是Spring的类CustomEditorConfigurer提供的属性,是一个Map,里面存放的都是自定义的编辑器(customEditors),比如这里存放的是UtilDatePropertyEditor日期编辑器,看CustomEditorConfigurer源码就知道了。

测试一下:
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import junit.framework.TestCase;

public class InjectionTest extends TestCase {
	
	private BeanFactory factory;
	
	@Override
	protected void setUp() throws Exception {
		factory = new ClassPathXmlApplicationContext("applicationContext.xml");	
	}

	public void testInjection1() {
		Bean1 bean1 = (Bean1)factory.getBean("bean1");
		System.out.println("bean1.dateValue=" + bean1.getDateValue());
	}
	
}

能打印出日期就OK了。
分享到:
评论
1 楼 javatozhang 2014-04-23  
很清晰、谢谢你的分析!

相关推荐

Global site tag (gtag.js) - Google Analytics