Spring 自定义属性编辑(CustomEditorConfigurer)和类型转换器(ConversionServiceFactoryBean)一起配置问题

问题:

现在这样一种需求, 有一个bean它的属性是java.util.Date类型,我们要在spring的xml配置初始化它,怎么做呢

解决方案:

可以说spring的属性编辑器和类型转换器都是做类型转换的,但属性编辑器多为string转其它类型,

方法1:

添加属性编辑器:

<!-- 日期属性编辑 -->
	<bean id="customEditorConfigurer"
		class="org.springframework.beans.factory.config.CustomEditorConfigurer">
		<property name="customEditors">
			<map>
				<entry key="java.util.Date">
					<bean class="com.UtilDatePropertyEditor">
						<property name="formate" value="yyyy-MM-dd HH:mm:ss"></property>
					</bean>
				</entry>
			</map>
		</property>
	</bean>

java:

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class UtilDatePropertyEditor extends PropertyEditorSupport {
	private String formate;

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formate);
		try {
			Date date = simpleDateFormat.parse(text);
			this.setValue(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public void setFormate(String formate) {
		this.formate = formate;
	}

}

方法二:

注册类型转换器

 Configuring a ConversionService

A ConversionService is a stateless object designed to be instantiated at application startup, then shared between multiple threads. In a Spring application, you typically configure a ConversionService instance per Spring container (or ApplicationContext). That ConversionService will be picked up by Spring and then used whenever a type conversion needs to be performed by the framework. You may also inject this ConversionService into any of your beans and invoke it directly.

[Note]  Note

If no ConversionService is registered with Spring, the original PropertyEditor-based system is used.

To register a default ConversionService with Spring, add the following bean definition with id  conversionService :

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean"/>

A default ConversionService can convert between strings, numbers, enums, collections, maps, and other common types. To suppliment or override the default converters with your own custom converter(s), set the  converters  property. Property values may implement either of the Converter, ConverterFactory, or GenericConverter interfaces.

<bean id="conversionService"
      class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="example.MyCustomConverter"/>
        </list>
    </property>
</bean>
以上为spring 官方reference关于注册类型转换器的介绍,其中说到"T  o suppliment or override the default converters with your own custom converter(s), set the    converters    property. Property values may implement either of the Converter, ConverterFactory, or GenericConverter interfaces.  "

告诉我们可能实以  Converter, ConverterFactory, or GenericConverter这三个接口中的一个和相应配置来补充类型转换

<bean id="conversionService"
		class="org.springframework.context.support.ConversionServiceFactoryBean">
		<property name="converters">
			<list>
				<bean class="String2DateConverter" />
			</list>
		</property>
	</bean>

import java.text.ParseException;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;
import org.springframework.core.convert.converter.Converter;

public class String2DateConverter implements Converter<String, Date> {

	@Override
	public Date convert(String arg0) {
		try {
			return DateUtils.parseDate(arg0,
					new String[] { "yyyy-MM-dd HH:mm:ss" });
		} catch (ParseException e) {
			return null;
		}
	}

}


java.lang.IllegalArgumentException: Left-hand side type must not be null 异常

以上两种方法都可满足需求,但是不能一起使用,一起使用就会出现这个问题,这是spring的一个bug,所以我们必须选择其中一种,我个人更倾向于第二种

bug描述 :  https://jira.springsource.org/browse/SPR-6807   其中说到:  ConversionService fails with CustomEditorConfigurer. While it is not recommended to mix the two in the same context it is unavoidable

spring 相关api:  http://static.springsource.org/spring/docs/3.0.x/reference/validation.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值