Spring中为bean注入Date对象

172 阅读5分钟
原文链接: yq.aliyun.com

Spring中为bean注入Date对象

泳泳啊泳泳 2018-01-08 12:27:39 浏览4770 评论0

摘要: 比如我们有下面的一个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;  ...

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


                            

                                                

                                                    
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,但是如果我们使用下面的配置:


                            

                                                

                                                    

                                                    <
                                                        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>                                                            

                                                

                                            

                        

  然后我们尝试着运行的话


                            

                                                

                                                    

                                                    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,然后引用。如下解决:


                            

                                                

                                                    

                                                    <
                                                        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对象。


                            

                                                

                                                    

                                                    <
                                                        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
                                                            >
                                                    

                                                

                                            

                        

  完整的配置为:


                            

                                                

                                                    

                                                    <
                                                        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,如需转载请自行联系原作者
【云栖快讯】阿里开发者们的第3个感悟:从身边开源开始学习,用过才能更好理解代码  详情请点击 评论 (0) 点赞 (0) 收藏 (0)
分享到:

相关文章

网友评论