spring的自定义属性编辑器CustomEditorConfigurer

4 篇文章 0 订阅

可能很多人跟我遇到同样一个问题,在老版本的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的自定义属性编辑器的注册,如果有的话就会进行转换然后将值注入,如果没有就会抛出异常。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值