2015-12-12 8 views
10

Piszę aplikację przy użyciu polecenia spring-boot-starter-jdbc (v1.3.0).Jak zarejestrować niestandardowe konwertery w rozruchu wiosennym?

Problem, który spotkałem: Wystąpienie BeanPropertyRowMapper kończy się niepowodzeniem, ponieważ nie można go przekonwertować z java.sql.Timestamp na java.time.LocalDateTime.

Aby skopiować ten problem, zaimplementowałem org.springframework.core.convert.converter.Converter dla tych typów.

public class TimeStampToLocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> { 

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

Moje pytanie brzmi: Jak mogę udostępnić TimeStampToLocalDateTimeConverter dla BeanPropertyRowMapper.

Bardziej ogólne pytanie, w jaki sposób mogę zarejestrować moje konwertery, aby udostępnić je w całym systemie?

Poniższy kod przynieść nam NullPointerException na etapie inicjalizacji:

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(); 
}  

Dziękuję.

+1

Po prostu dodaj konwerter jako ziarno ... Usuń wszystko inne. –

+0

Mylące 'HttpMessageConverter' i' Converter' tutaj. Wystarczy dodać klasę, która rozszerza 'WebMVcConfigurerAdapter' i implementuje metodę' addFormatters'. Na 'FormatterRegistry' wywołaj' addConverter' dla tych, które chcesz dodać. –

+0

Nie mam środowiska internetowego. –

Odpowiedz

0

Proponuję użyć @Autowired i związanego z nim mechanizmu wtrysku zależności sprężyny, aby użyć jednej instancji ConversionService w całej aplikacji. Usługa ConversionService zostanie utworzona w ramach konfiguracji.

Wszystkie konwertery, które mają być dostępne, mają szerokie zastosowanie do otrzymywania adnotacji (np. @AutoRegistered). Po uruchomieniu aplikacji @Component FormatterRegistrar (sama nazwa typu jest trochę myląca, tak, to jest "... rejestrator", ponieważ rejestruje się, a @Component, ponieważ jest w pełni zarządzany i wymaga wtrysku zależności), otrzyma listę @AutoRegistered wszystkich opisywanych konwerterów.

Zobacz ten wątek dla concrete implementation details. Używamy tego mechanizmu w naszym projekcie i działa to jak urok.

Powiązane problemy