Spring inject Date into bean pro

2015-08-20  本文已影响79人  lovePython

Spring example to show you how to inject a “Date” into bean property.

package com.mkyong.common;
import java.util.Date;

public class Customer { 
    Date date; 
    public Date getDate() { 
       return date; 
    } 
    public void setDate(Date date) { 
        this.date = date; 
    } 
    @Override 
    public String toString() { 
        return "Customer [date=" + date + "]"; 
    }
}

Bean configuration file

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="customer" class="com.mkyong.common.Customer">
        <property name="date" value="2010-01-31" />
    </bean>
</beans>

Run it

package com.mkyong.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App { 

    public static void main(String[] args) { 

        ApplicationContext context = new ClassPathXmlApplicationContext( "SpringBeans.xml"); 
        Customer cust = (Customer) context.getBean("customer"); 
        System.out.println(cust); 
    }
}

You will encounter follow error messages :

Caused by: org.springframework.beans.TypeMismatchException: 
    Failed to convert property value of type [java.lang.String] to 
    required type [java.util.Date] for property 'date'; 

nested exception is java.lang.IllegalArgumentException: 
    Cannot convert value of type [java.lang.String] to
    required type [java.util.Date] for property 'date': 
    no matching editors or conversion strategy found
``
Solution
In Spring, you can inject a `Date` via two methods :

###1. Factory bean
Declare a dateFormat bean, in “`customer`” bean, reference “`dateFormat`” bean as a factory bean. The factory method will call `SimpleDateFormat.parse()` to convert String into Date object automatically.

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="customer" class="com.mkyong.common.Customer">
<property name="date">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2010-01-31" />
</bean>
</property>
</bean>
</beans>

##2. CustomDateEditor
Declares a `CustomDateEditor` class to convert `String` into **`java.util.Date`**.

<?xml version="1.0"?>
<bean id="dateEditor" class="org.springframework.beans.propertyeditors.CustomDateEditor">
<constructor-arg>
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
</constructor-arg>
<constructor-arg value="true" />
</bean>


And declares another “`CustomEditorConfigurer`”, to make Spring convert bean properties whose type is **`java.util.Date`**.

<?xml version="1.0"?>
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date">
<ref local="dateEditor" />
</entry>
</map>
</property>
</bean>


Full example of bean configuration file.

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dateEditor" class="org.springframework.beans.propertyeditors.CustomDateEditor">
<constructor-arg>
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
</constructor-arg>
<constructor-arg value="true" />
</bean>
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date">
<ref local="dateEditor" />
</entry>
</map>
</property>
</bean>
<bean id="customer" class="com.mkyong.common.Customer">
<property name="date" value="2010-02-31" />
</bean>
</beans>

上一篇下一篇

猜你喜欢

热点阅读