2015-12-12 6 views
10

Я пишу приложение, используя 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<Timestamp, LocalDateTime> { 

    @Override 
    public LocalDateTime convert(Timestamp s) { 
     return s.toLocalDateTime(); 
    } 
} 

Мой вопрос: Как сделать доступным TimeStampToLocalDateTimeConverter для BeanPropertyRowMapper.

Более общий вопрос, как я могу зарегистрировать свои конвертеры, чтобы сделать их доступными для всей системы?

Следующий код приводит нас к NullPointerException на этапе инициализации:

private Set<Converter> getConverters() { 
    Set<Converter> converters = new HashSet<Converter>(); 
    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(); 
}  

Спасибо.

+1

Просто добавьте конвертер в виде боба ... Удалите все остальное. –

+0

Смущает 'HttpMessageConverter' и' Конвертер' здесь. Просто добавьте класс, который расширяет 'WebMVcConfigurerAdapter' и реализует метод' addFormatters'. В 'FormatterRegistry' вызывается' addConverter' для тех, которые вы хотите добавить. –

+0

У меня нет веб-среды вообще. –

ответ

0

Я предлагаю использовать @Autowired и соответствующий механизм впрыска зависимостей весны для использования одного экземпляра ConversionService во всем приложении. ConversionService будет создан в конфигурации.

Все преобразователи, доступные для широкого применения, получают аннотацию (например, @AutoRegistered). При запуске приложения @Component FormatterRegistrar (само название типа немного вводит в заблуждение, да, это «... Регистратор», поскольку он регистрирует. И @Component, поскольку он полностью управляется весной и требует инъекции зависимостей) получит @AutoRegistered List всех аннотированных преобразователей.

Просмотреть эту тему для concrete implementation details. Мы используем этот механизм в рамках нашего проекта, и он работает как шарм.

Смежные вопросы