2015-12-12 15 views
10

Scrivo applicazione utilizzando spring-boot-starter-jdbc (v1.3.0).Come registrare convertitori personalizzati in avvio di primavera?

Il problema che ho incontrato: l'istanza di BeanPropertyRowMapper non riesce poiché non può convertire da java.sql.Timestamp a java.time.LocalDateTime.

Per copiare questo problema, ho implementato org.springframework.core.convert.converter.Converter per questi tipi.

public class TimeStampToLocalDateTimeConverter implements Converter<Timestamp, LocalDateTime> { 

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

La mia domanda è: Come faccio a disposizione TimeStampToLocalDateTimeConverter per BeanPropertyRowMapper.

Domanda più generale, come registrare i convertitori per renderli disponibili a livello di sistema?

Il seguente codice portarci a NullPointerException sul palco di inizializzazione:

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

Grazie.

+1

Basta aggiungere il convertitore come bean ... Rimuovere tutto il resto. –

+0

Confondere 'HttpMessageConverter' e' Converter' qui. Basta aggiungere una classe che estende 'WebMVcConfigurerAdapter' e implementare il metodo' addFormatters'. Sulla 'FormatterRegistry' chiama' addConverter' per quelli che vuoi aggiungere. –

+0

Non ho affatto un ambiente web. –

risposta

0

Suggerisco di utilizzare @Autowired e il relativo meccanismo di iniezione delle dipendenze di primavera per utilizzare una singola istanza di ConversionService nell'applicazione. Il servizio di conversione verrà istanziato all'interno della configurazione.

Tutti i convertitori per essere disponibili a livello di applicazione ricevono un'annotazione (ad esempio, @AutoRegistered). All'avvio dell'applicazione un @Component FormatterRegistrar (il nome del tipo stesso è un po 'fuorviante, sì è "... Registrar" come fa la registrazione.E @Component dato che è completamente gestito in primavera e richiede l'integrazione della dipendenza) riceverà @AutoRegistered List di tutti i convertitori annotati.

Vedere questa discussione per concrete implementation details. Usiamo questo meccanismo all'interno del nostro progetto e funziona come un incantesimo.

Problemi correlati