可能很多人跟我遇到同样一个问题,在老版本的spring下用CustomEditorConfigurer自定义编辑器的时候没问题,当升级spring版本之后,就会报错,错误:
Failed to convert property value of type 'java.util.LinkedHashMap' to required type 'java.util.Map' for property 'customEditors'; nested exception is java.lang.IllegalArgumentException
Cannot convert value of type 'spring05.AddressEditor' to required type 'java.lang.Class' for property 'customEditors[spring05.Address]':PropertyEditor [org.springframework.beans.propertyeditors.ClassEditor] returned inappropriate value of type 'spring05.AddressEditor'
因为新版本spring的CustomEditorConfigurer类对这个customEditors参数属性进行了改变:
//新版本
private Map<Class<?>, Class<? extends PropertyEditor>> customEditors;
//老版本
private Map customEditors;
我们拿一个例子来,下面是定义的一个属性转换器,就是把注入的时候的字符串转换为Address类型
public class AddressEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Address address = new Address();
address.setCity(text);
setValue(address);
}
}
如果有一个Person类里面有个属性是Address的对象,用spring注入的时候需要通过上面的转换器将配置的字符串转换成Address对象,那么就会用到CustomEditorConfigurer
<!-- 自定义编辑器 -->
<!-- 老版本 -->
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="spring05.Address">
<bean class="spring05.AddressEditor"/>
</entry>
</map>
</property>
</bean>
<!-- 新版本 -->
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="spring05.Address" value="spring05.AddressEditor"/>
</map>
</property>
</bean>
注入Person:
<bean id="person" class="spring05.Person">
<property name="ads" value="ADDRESS"/>
</bean>
从上面可以看出,老版本里面value是配置的一个bean,而新版本是配置的包名,新版本的customEditors成员变量需要一个继承于PropertyEditor的Class所以应该配置成类全限定名。
这样到时候spring注入Address属性的时候发现类型不匹配,你注入的是String类型,需要的却是Address类型,就会到spring容器的自定义属性编辑注册区里面去看看是否有String转换成Address的自定义属性编辑器的注册,如果有的话就会进行转换然后将值注入,如果没有就会抛出异常。