spring如何在xml里配置Calendar,Date

文章地址:http://blog.csdn.net/hengyunabc/article/details/14107963

在Spring MVC里可以通过message converter机制来对数据进行格式化,但是在普通的Spring xml配置里就无能为力了。

在网上找了一通,发现也有很多人苦恼这个问题,不妨记录下。

Spring 自带一个PropertyEditor的机制,但是这个是全局的,假如你的配置文件要是和别人有不同的话,那就悲剧了,比如你配置的时间的格式是“yyyy-mm-dd",别人的是"yyyy-mm-dd-hh”。别外自定义的PropertyEditor还要注册到ApplicationContext里,非常麻烦,而且这个也是一个全局的配置。

http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html#beans-beans-conversion

别外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="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>

来自:http://www.mkyong.com/spring/spring-how-to-pass-a-date-into-bean-property-customdateeditor/

配置Calendar:

至于Calendar,则没有Date那么容易了,因为Calendar是一个抽象类。一般都是通过Calendar.getInstance()来得到一个实例的。

Spring forum上有个网友给出了一个很巧妙的办法:

http://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" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

   <bean id="janFirst2006" class="org.spring.forum.CalendarFactoryBean">
      <property name="year" value="2006" />
      <property name="month" value="0" />
      <property name="date" value="1" />
   </bean>

   <bean id="janFirst2006_noon" class="org.spring.forum.CalendarFactoryBean">
      <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 id="calendarBean" class="java.util.Calendar" factory-method="getInstance">
    <property name="time" ref="dateBean"/>
</bean> 

另一个是,参考上面AbstractFactoryBean的思路,其实我们自己定义一个支持自定义格式化字符串的AbstractFactoryBean也是可行的。

不过,扯了这么久,上面都是如何得到一个Date或者Calendar对象,如果硬是要是配置文件里直接用字符串的方式把Date或者Calendar注入到一个Bean,那么只用在Spring Context里注册一个全局的PropertyEditor了。

时间: 2024-12-06 17:42:14

spring如何在xml里配置Calendar,Date的相关文章

ssh配置时。在xml里配置注入sessionfactory失败。而用@Resource注解的方式配置成功

问题描述 ssh配置时.在xml里配置注入sessionfactory失败.而用@Resource注解的方式配置成功 ssh配置时.在xml里配置注入sessionfactory失败.而用@Resource注解的方式配置sessionfactory却可以成功.这是为什么? <!--配置报错--> public class BaseServiceImpl implements BaseServiceInter { @Resource private SessionFactory sessionF

Spring IoC — 基于XML的配置

原文:Spring IoC - 基于XML的配置 1.属性注入 注意点: 1)如果类中显示定义了一个带参的构造函数,则一定还要显示提供一个无参构造函数,否则使用属性注入时将抛出异常. 2)JavaBean关于属性命名的特殊规范.Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性变量则不做要求.如maxSpeed对应setMaxSpeed(),brand对应setBrand(). 所以<property>元素的属性变量名应满足:xxx的属性对应setXxx

JSF的onload-confg 能在web.xml里配置多个配置文件吗?

问题描述 例如正常一个配置文件web.xml是这么写<context-param><param-name>onload-config</param-name><param-value>/WEB-INF/onload-config.xml</param-value></context-param>哪位知道怎么配置多个文件?我试了用逗号隔开不行.<context-param><param-name>onload-c

TextView在xml里配置onclick事件

原文:http://blog.csdn.net/goleftgoright/article/details/7412760 一个小问题,给TextView添加Onclick事件还需要配置android:clickable="true",否则点击无效.   <TextView             android:id="@+id/tvTab1"             android:layout_width="fill_parent"

spring的aop是否和struts2.xml里的param配置冲突

问题描述 spring的aop是否和struts2.xml里的param配置冲突 用aop控制权限,然后把struts2所有action用spring代理创建,action里有个pagesize属性,有getset方法,在struts2里配置了一个action,其中用param 给pagesize一个默认值15,aop里是如果没权限就response跳转了,但是实际情况却是每次调那个action,都会先去执行两次getPageSize(),然后第二次response跳转就报java.lang.I

eclipse rcp-eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action

问题描述 eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action action是在extensions里重写eclipse提供的标准扩展点:org.eclipse.ui.actionSets.想在Activator中获取此action对象并调用setEnable()方法,达到控制按钮的可用和禁用状态.望各位大神帮忙! 解决方案 目前我也不会,但是需要积分

Spring Web工程web.xml零配置即使用Java Config + Annotation

摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式: 在开始之前,我们需要注意一下,要基于Java Config实现无web.xml的配置,我们的工程的Servlet必须是3.0及其以上的版本: 1.我们要实现无web.xml的配置,只需要关注实现WebApplicationInitializer这个

jira向后台发的请求,在actions.xml里找不到对应的action配置

问题描述 jira向后台发的请求,在actions.xml里找不到对应的action配置 前台页面访问这个接口http://172.22.0.25:8081/secure/QuickCreateIssue!default.jspa?decorator=none在actions.xml里找不到.它在请求的,求解

在Spring中同时使用了Annotation配置和XML配置,spring优先使用哪一个

问题描述 新近接触了SpringMVC3.0,从个人感觉来讲我非常喜欢.之所以从3.0版本才开始学习,也是对于旧版本的XML配置有所忌惮.SpringMVC从2.5版本引入了annotation,到了3.0有了进一步增强.参考了文章http://bulargy.iteye.com/blog/179781的一些观点,我也觉得有时候Annotation较之于XML-configuration有其固有的限制.混搭比较好,比如说想在发布环境上动态修改接口的具体实现,但是不想重新编译Java代码的情况下.