Struts中用一个类型转换器,在Spring中也有类似的功能,叫做属性编辑器,用于将spring配置文件中配置的字符串转换为Action中相应的类型。
这里有一个普通的JavaBean,代码如下:
package cn.com.huixin.spring; import java.util.Date; import java.util.List; import java.util.Map; public class Bean1 { private String stringValue; private List list1; private Map map1; private String[] array; private Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } public List getList1() { return list1; } public void setList1(List list1) { this.list1 = list1; } public Map getMap1() { return map1; } public void setMap1(Map map1) { this.map1 = map1; } public String[] getArray() { return array; } public void setArray(String[] array) { this.array = array; } }里边有几个属性需要使用spring注入。前边的四个属性注入都没有问题,只有后边的Date型的属性注入时会出错,提示类型不匹配。从spring配置文件中出过来的都是String型的字符串值,而Bean中是一个Date类型的值,这个属性就需要我们提供一个属性编辑器来完成类型转换工作。
首先创建一个属性编辑器,该类需要继承java.beans.PropertyEditorSupport类,代码如下所示:
package cn.com.huixin.editor; import java.beans.PropertyEditorSupport; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DatePropertyEditor extends PropertyEditorSupport { private String format = "yyyy-MM-dd"; public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } @Override public void setAsText(String text) throws IllegalArgumentException { SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date date = null; try { date = dateFormat.parse(text); } catch (ParseException e) { e.printStackTrace(); } this.setValue(date); } }该类中有一个String型的format属性,为日期格式,并为它提供的get/set方法。该类重写了setAsText(String text)方法,该方法用于进行类型转换。参数text为从spring配置文件中获得的字符串值。使用SimpleDateFormat对象将其转换为Date对象后,调用setValue()方法将转换后的对象放入value对象中。
接下来配置applicationContext.xml文件,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for JPetStore's business layer. - Contains bean references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation"). --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="bean1" class="cn.com.huixin.spring.Bean1"> <property name="stringValue" value="stringValue1" /> <property name="list1"> <list> <value>listValue1</value> <value>listValue2</value> <value>listValue3</value> </list> </property> <property name="map1"> <map> <entry key="mapkey1" value="mapValue1" /> <entry key="mapkey2" value="mapValue2" /> </map> </property> <property name="array"> <list> <value>arrayValue1</value> <value>arrayValue2</value> </list> </property> <property name="birthday" value="2010-07-24" /> </bean> </beans>这个文件中对Bean1种的各属性注入了值。接下来再提供一个applicationContext-propertyEditor.xml文件,专门用于属性编辑器的配置,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for JPetStore's business layer. - Contains bean references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation"). --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.util.Date"> <bean class="cn.com.huixin.editor.DatePropertyEditor"> <property name="format" value="yyyy-MM-dd" /> </bean> </entry> </map> </property> </bean> </beans>该文件中实例化了一个org.springframework.beans.factory.config.CustomEditorConfigurer的对象,该类中有一个名为customEditors的Map对象,在该对象中添加了一个键值对,key属性值为java.util.Date,即类型转换的目标类型,value属性值为cn.com.huixin.editor.DatePropertyEditor,即我们编写的属性编辑器,这个类用来进行类型转换。在cn.com.huixin.editor.DatePropertyEditor类中有一个名为format的属性值,即日期格式,这里我们也对它进行了注入。到目前为止,我们的属性编辑器就编写好了,下来写一个类进行测试。测试代码如下所示:
package cn.com.huixin.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.com.huixin.spring.Bean1; import junit.framework.TestCase; public class BeanInject extends TestCase { private BeanFactory factory; @Override protected void setUp() throws Exception { factory = new ClassPathXmlApplicationContext("applicationContext*.xml"); } public void testBean() { Bean1 bean1 = (Bean1) factory.getBean("bean1"); System.out.println(bean1.getStringValue()); System.out.println(bean1.getList1()); System.out.println(bean1.getMap1()); System.out.println(bean1.getArray()); System.out.println(bean1.getBirthday()); } }首先通过ClassPathXmlApplicationContext对象加载了以applicationContext开头的xml文件,获得一个BeanFactory对象,然后调用该对象的getBean()方法就可以获得为属性注入的值。运行的结果为:
stringValue1 [listValue1, listValue2, listValue3] {mapkey1=mapValue1, mapkey2=mapValue2} [Ljava.lang.String;@1982fc1 Sat Jul 24 00:00:00 CST 2010说明我们的值注入成功。