spring如何在xml裏配置Calendar,Date
文章地址:https://blog.csdn.net/hengyunabc/article/details/14107963
在Spring MVC裏可以通過message converter機製來對數據進行格式化,但是在普通的Spring xml配置裏就無能為力了。
在網上找了一通,發現也有很多人苦惱這個問題,不妨記錄下。
Spring 自帶一個PropertyEditor的機製,但是這個是全局的,假如你的配置文件要是和別人有不同的話,那就悲劇了,比如你配置的時間的格式是“yyyy-mm-dd",別人的是"yyyy-mm-dd-hh”。別外自定義的PropertyEditor還要注冊到ApplicationContext裏,非常麻煩,而且這個也是一個全局的配置。
https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html
別外Spring文檔裏提到了一個BeanInfo機製,但實際這個機製很坑爹,這個對Date無用,因為CustomDateEditor默認是沒有注冊到Spring裏的。
Customizable property editor for java.util.Date, supporting a custom DateFormat. NOT registered by default. Must be user registered as needed with appropriate format.
配置Date:
下麵來看下如何利用Spring提供的Factory bean機製來初始化Date對象的:
<beans xmlns="https://www.springframework.org/schema/beans" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean > <constructor-arg value="yyyy-MM-dd" /> </bean> <bean > <property name="date"> <bean factory-bean="dateFormat" factory-method="parse"> <constructor-arg value="2010-01-31" /> </bean> </property> </bean> </beans>
來自:https://www.mkyong.com/spring/spring-how-to-pass-a-date-into-bean-property-customdateeditor/
配置Calendar:
至於Calendar,則沒有Date那麼容易了,因為Calendar是一個抽象類。一般都是通過Calendar.getInstance()來得到一個實例的。
Spring forum上有個網友給出了一個很巧妙的辦法:
https://forum.spring.io/forum/spring-projects/container/22111-inject-java-util-calendar-instance
package org.spring.forum; import java.util.Calendar; import org.springframework.beans.factory.config.AbstractFactoryBean; public class CalendarFactoryBean extends AbstractFactoryBean { /** * Year; defaults to zero. */ private int year = 0; /** * Month; defaults to zero. */ private int month = 0; /** * Date; defaults to zero. */ private int date = 0; /** * Number of hour of day (24 hour); defaults to zero. */ private int hourOfDay = 0; /** * Number of minutes; defaults to zero. */ private int minute = 0; /** * Number of seconds; defaults to zero. */ private int second = 0; public void setYear(int year) { this.year = year; } public void setMonth(int month) { this.month = month; } public void setDate(int date) { this.date = date; } public void setHourOfDay(int hourOfDay) { this.hourOfDay = hourOfDay; } public void setMinute(int minute) { this.minute = minute; } public void setSecond(int second) { this.second = second; } @Override protected Object createInstance() throws Exception { Calendar calendar = Calendar.getInstance(); calendar.set(this.year, this.month, this.date, this.hourOfDay, this.minute, this.second); return calendar; } public Class getObjectType() { return Calendar.class; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> <bean > <property name="year" value="2006" /> <property name="month" value="0" /> <property name="date" value="1" /> </bean> <bean > <property name="year" value="2006" /> <property name="month" value="0" /> <property name="date" value="1" /> <property name="hourOfDay" value="12" /> </bean> </beans>
如果非要用字符串的方式來配置一個Calendar,如"1999-09-09"。有兩個思路,一個是把一個Date對象setter到一個Calendar裏,這個就很繞彎了。
<bean factory-method="getInstance"> <property name="time" ref="dateBean"/> </bean>
另一個是,參考上麵AbstractFactoryBean的思路,其實我們自己定義一個支持自定義格式化字符串的AbstractFactoryBean也是可行的。
不過,扯了這麼久,上麵都是如何得到一個Date或者Calendar對象,如果硬是要是配置文件裏直接用字符串的方式把Date或者Calendar注入到一個Bean,那麼隻用在Spring Context裏注冊一個全局的PropertyEditor了。
最後更新:2017-04-03 14:54:00