如何在弹簧靴中注册自定义转换器?
我使用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列表所有带注释的转换器。
有关具体的实现细节,请参阅此主题 我们在项目中使用这种机制,它就像一个魅力。