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

标签 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);

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

<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 的“格式化程序”属性。是 有什么我从根本上缺少的吗?或者是我的理解 格式化程序是完全错误的吗?
  • 如果当我在 applicationContext 中使用 spring 来 debitCardNumber 时它抛出异常,那么当我从应用程序显式调用转换方法时它如何正常工作?当我检查时,甚至 bean 也被正确创建。

最佳答案

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

<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 为“conversionService”的转换服务 bean,以便它可以使用它来解析您的 bean,而不是属性编辑器(在 Spring 3.0 之前)。

那么现在为什么它适用于转换器而不是格式化程序,因为自定义格式化程序的 id 名称与 spring 正在寻找的 id("conversionService") 不匹配。

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

希望这有帮助。

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

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

关于java - 自定义格式化程序未注册 - ConversionNotSupportedException : Spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37796517/

相关文章:

java - 根据相互依赖关系对 spring beans 进行排序

java - 使用正则表达式将所有短语集替换为最后一个短语?

java - 返回再次询问行数

java - 在一个命令中提取多个 jar

java - 找不到类 Spring MVC

java - Android:无法实例化类:没有空构造函数

java - Maven项目和名称中带有unicode字符的文件

java - Spring 与 hibernate : Duplicate entry for key 'PRIMARY'

java - 未使用 Hibernate 持久化实体

java - 如何在 Spring 中为 Autowiring 指定默认 bean?