如何在 Spring 3 中注册一个 GenericConverter 供 SimpleJdbcCall 对象使用?

问题描述 投票:0回答:1

使用Spring 3.0.x,我编写了一个SimpleJdbcCall,使用returningResultSet()定义了一个BeanPropertyRowMapper。

现在我想用强类型 ID 替换用于对象 ID 的 java.lang.Long 类型,即定义一个 PersonId 类,该类将实际 ID 值保存为 Long 变量。

我编写了一个 org.springframework.core.convert.converter.GenericConverter 实现,它将 JDBC 返回的 BigDecimal 转换为 PersonID(以及其他一些类,用于其他类)。

我将转换器注册为:

<bean id="conversionService"
    class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
    <set>
        <bean class="xxx.impl.IDTypeConverter"/>
    </set>
</property>

问题

Spring 不使用我的转换器。

调试导致方法 org.springframework.beans.TypeConverterDelegate.convertIfNecessary(String, Object, Object, Class, TypeDescriptor) 其中:

ConversionService conversionService = this.propertyEditorRegistry.getConversionService();

此方法返回 null。没有使用任何转换。

搜索网络我发现https://stackoverflow.com/a/12798635哪里说:

spring 试图找到一个使用 PropertyEditor 注册的自定义转换器

然后它提出了使用属性编辑器的解决方案,但没有详细说明如何实际执行。 (我在那里问过)

另一个答案https://stackoverflow.com/a/53120800说使用(Abstract)JdbcConfiguration中的方法jdbcCustomConversions(),但我在项目中找不到这些类。

我可以为每个 JDBC 调用编写一个自定义 RowMapper,但这需要很多代码。

问题是:如何用尽可能少的代码来转换这些数据类型?

java spring spring-jdbc
1个回答
0
投票

我在 DAO 类中提出了这个解决方案,其中使用了 SimpleJdbcCall 对象:

@Autowired
private ConversionService conversionService;
//...
{
        BeanPropertyRowMapper<MyDTO> rowMapper1 = new BeanPropertyRowMapper<MyDTO>() {
        @Override
        protected void initBeanWrapper(BeanWrapper bw)
        {
            bw.setConversionService(conversionService);
        }
    };
    rowMapper1.setMappedClass(MyDTO.class);
    
    mySimpleJdbcCall.returningResultSet("p_my_object", rowMapper1);

这适用于(在 JUnit 测试中)从数据库读取数据。 我稍后会报告写作是如何进行的(如果有的话)。

© www.soinside.com 2019 - 2024. All rights reserved.