如何在弹簧靴中注册自定义转换器?

我使用spring-boot-starter-jdbc(v1.3.0)编写应用程序。

我遇到的问题: BeanPropertyRowMapper实例失败,因为它无法从java.sql.Timestamp转换为java.time.LocalDateTime

为了复制这个问题,我为这些类型实现了org.springframework.core.convert.converter.Converter

 public class TimeStampToLocalDateTimeConverter implements Converter { @Override public LocalDateTime convert(Timestamp s) { return s.toLocalDateTime(); } } 

我的问题是:如何为BeanPropertyRowMapper提供TimeStampToLocalDateTimeConverter

更一般的问题是,如何注册我的转换器,以使它们在系统范围内可用?

以下代码在初始化阶段将我们带到NullPointerException

 private Set getConverters() { Set converters = new HashSet(); converters.add(new TimeStampToLocalDateTimeConverter()); converters.add(new LocalDateTimeToTimestampConverter()); return converters; } @Bean(name="conversionService") public ConversionService getConversionService() { ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); bean.setConverters(getConverters()); bean.afterPropertiesSet(); return bean.getObject(); } 

谢谢。

我建议使用@Autowired和spring的相关dependency injection机制在整个应用程序中使用单个ConversionService实例。 ConversionService将在配置中实例化。

应用程序范围内可用的所有转换器都会收到注释(例如@AutoRegistered)。 在应用程序启动@Component FormatterRegistrar(类型名称本身有点误导,是的,它是“…注册器”,因为它进行注册。而@Component因为它是完全弹簧管理并需要dependency injection)将接收@AutoRegistered列表所有带注释的转换器。

有关具体的实现细节,请参阅此主题 我们在项目中使用这种机制,它就像一个魅力。