使用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,但这需要很多代码。
问题是:如何用尽可能少的代码来转换这些数据类型?
我在 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 测试中)从数据库读取数据。 我稍后会报告写作是如何进行的(如果有的话)。