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

来源:互联网 发布:淘宝买家等级哪里看 编辑:程序博客网 时间:2024/04/28 04:07

问题:

现在这样一种需求, 有一个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;@Overridepublic 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关于注册类型转换器的介绍,其中说到"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."

告诉我们可能实以 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> {@Overridepublic 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