未注册的自定义格式化程序 - ConversionNotSupportedException:Spring

时间:2016-06-13 18:12:59

标签: java spring

我有自定义格式化程序@Component class DebitCardNumberFormatter implements Formatter<DebitCardNumber>{...}我已将此格式化程序添加到FormattingConversionServiceFactoryBean

<bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <ref bean="debitCardNumberFormatter"/>
            </set>
        </property>
</bean>

现在,当我显式运行以下代码时,它正常工作,字符串变为DebitCardNumber,

DebitCardNumber debitCardNumber=formattingConversionService.convert("1234-3242
 -4533-3432",DebitCardNumber.class);

但是如果我尝试在另一个带有字符串值的bean中注入DebitCardNumber,

<bean id="cardDetails" class="com.amudhan.springcore.formatter.CardDetails">
        <property name="debitCardNumber" value="1234-3242-4533-3432"></property>
</bean>

容器抛出ConversionNotSupportedException。

 org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type [java.lang.String] to required type [com.amudhan.springcore.formatter.DebitCardNumber] for property 'debitCardNumber'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.amudhan.springcore.formatter.DebitCardNumber] for property 'debitCardNumber': no matching editors or conversion strategy found`enter code here`
  • 我正在阅读Spring文档并练习API。什么 我在这儿失踪了?
  • 以前当我创建'转换器'时,我使用了'转换器'属性 ConversionServiceFactoryBean添加转换器并使用它 自动。
  • 以同样的方式,我尝试使用。添加格式化程序 FormattingConversionServiceFactoryBean的'formatters'属性。是 有什么我从根本上失踪了吗?或者是我的理解 格式化程序是完全错误的吗?
  • 如果我在applicationContext中使用spring debitCardNumber时抛出异常,那么当我从app中显式调用convert方法时它是如何正常工作的呢?当我检查时,甚至豆子都被正确创建了。

1 个答案:

答案 0 :(得分:1)

这是注册自定义格式化程序的一种方法

<mvc:annotation-driven conversion-service="conversionService"/>
 <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
   <property name="formatters">
    <set>
        <ref bean="debitCardNumberFormatter"/>
    </set>
   </property>
 </bean>

<强>更新

在仔细查看代码后,好吧。所以Spring正在你的应用程序上下文中寻找转换服务bean,其中包含id&#34; conversionService&#34;在Abstract bean工厂中,所以它可以使用它来解析你的bean而不是属性编辑器(在Spring 3.0之前)。

所以现在为什么它适用于转换器但不适用于格式化程序,因为自定义格式化程序的ID名称与id(&#34; conversionService&#34;)正在寻找。

id的任何其他名称都不起作用,因此在选择转换器或格式化程序之间没有问题。

希望这有帮助。

格式化程序的这个例子应该可以工作。

 <bean id="conversionService"
          class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <ref bean="debitCardNumberFormatter"/>
            </set>
        </property>
    </bean>