欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring 自定义属性编辑器

程序员文章站 2022-05-26 17:52:57
...

前言: 使用spring的属性注入可以为一个实体bean(有对应的set方法)的属性注入值,例如:

<bean id="studySPro" class="study.spring.StudySPro">
		<property name="intValue" value="100"></property>
		<property name="strValue" value="stringValue"></property>
		<property name="doubleValue" value="10.36"></property>
		<property name="listValue">
			<list>
				<value>listValue1</value>
				<value>listValue2</value>
				<value>listValue3</value>
			</list>
		</property>
		<property name="mapValue">
			<map>
				<entry key="key1" value="value1"/>
				<entry key="key2" value="value2"/>
				<entry key="key3" value="value3"/>
			</map>
		</property>
		<property name="setValue">
			<set>
				<value>setValue1</value>
				<value>setValue2</value>
				<value>setValue3</value>
			</set>
		</property>
		<property name="arrayStrValue">
			<list>
				<value>arrayStrValue1</value>
				<value>arrayStrValue2</value>
				<value>arrayStrValue3</value>
			</list>
		</property>
		<property name="dateValue" value="1988-02-16"></property>
	</bean>

  当在对一个java.util.Date类型的属性注入值的时候,会出现异常,因为spring默认的方式不能够将类似"1988-02-16"的字符串解析为java.util.Date类型.为了解决这个问题,我们需要自己编写将类似"1988-02-16"这样的字符串解析为Date对象的方式,就是这里要说明的 “自定义属性编辑器” .

 首先定义一个"自定义属性编辑器类",该类继承了java.beans.PropertyEditorSupport,并且覆写该类的setAsText(String text)方法,通过这个text参数,我们可以拿到欲转换的字符串,例如"1988-02-16".

package study.spring;

import java.beans.PropertyEditorSupport;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DatePropetyEdtor extends PropertyEditorSupport{

	private String format = "yyyy-MM-dd";
	
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		DateFormat df = new SimpleDateFormat(format);
		try {
			Date date = df.parse(text);
			this.setValue(date);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

 注意 : 这个setAsText方法并没有返回值,我们通过调用setValue(Object obj)方法使得我们将字符串转换后的Date对象生效.

 最后,要使得spring能够识别并使用我们的自定义属性编辑器,我们需要将这个类注入到一个spring的类的属性中,该属性是org.springframework.beans.factory.config.CustomEditorConfigurer类的customEditors属性,该属性是一个map类型,我们的注入方式类似这样:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.util.Date">
					<bean class="study.spring.DatePropetyEdtor"></bean>
				</entry>
			</map>
		</property>
	</bean>

</beans>

 到这里,我们的自定义属性编辑器就可以正常工作了.

 

其他 :

         对于例子代码中 <property name="dateValue" value="1988-02-16"></property>,如果这里我们注入的值变为 "1988/02/16",则又会出异常了,因为我们的 format = "yyyy-MM-dd",对于这种情况,我们可以将转换格式format也抽取出来,使用spring的注入来为其赋值. 例如在构造函数中为format赋值,或者为format添加一个set方法。