且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Spring中为bean注入Date对象

更新时间:2022-05-29 16:21:42

比如我们有下面的一个bean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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中有一个Date,但是如果我们使用下面的配置:

1
2
3
4
5
6
7
8
9
10
<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>

  然后我们尝试着运行的话

1
2
3
4
5
6
7
8
9
10
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);
  
    }
}

会出现如下的错误:

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 foun
在这里提供两种解决办法:

1. Factory bean

声明一个dateFormat的bean,然后引用。如下解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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

我们声明一个CustomDateEditor,将String转换为Date对象。

1
2
3
4
5
6
7
8
9
10
<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>

  

1
2
3
4
5
6
7
8
9
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
       <property name="customEditors">
           <map>
               <entry key="java.util.Date">
                   <ref local="dateEditor" />
               </entry>
           </map>
       </property>
   </bean>

  完整的配置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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>

  

 


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/12/27/2835191.html,如需转载请自行联系原作者