Custom Cassandra Converter

I started looking for a good solution on how to beautifully save an object using Spring CassandraOperations. The problems arose because some fields inside my object are not supported by cassandra, for example. joda DateTime.

The workaround is to have additional fields inside a single object of type java.util.Date instead of joda DateTime, mark raw fields with @Transient. But this is not clean, so I started looking for automatic user conversion.

Currently, the link spring -data-cassandra does not provide user converter registration information. http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.custom-converters

Is it possible to register a custom converter (e.g. Spring Data Cassandra LocalDateTime Conversion ) in a CassandraSessionFactoryBean?

This is my @Configuration code open class CassandraConfig {

@Value("${cassandra.contactpoints}") private String cassandraContactPoint; @Value("${cassandra.port}") private int cassandraPort; @Value("${cassandra.keyspace}") private String cassandraKeySpace; @Bean public CassandraClusterFactoryBean cluster() { CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean(); cluster.setContactPoints(cassandraContactPoint); cluster.setPort(cassandraPort); return cluster; } @Bean public CassandraMappingContext mappingContext() { return new BasicCassandraMappingContext(); } @Bean public CassandraConverter converter() { return new MappingCassandraConverter(mappingContext()); } @Bean public CassandraSessionFactoryBean session() throws Exception { CassandraSessionFactoryBean session = new CassandraSessionFactoryBean(); session.setCluster(cluster().getObject()); session.setKeyspaceName(cassandraKeySpace); session.setConverter(converter()); session.setSchemaAction(SchemaAction.NONE); return session; } @Bean public CassandraOperations cassandraTemplate() throws Exception { return new CassandraTemplate(session().getObject()); } @Bean public ConversionService getConversionService() { ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean(); bean.setConverters(new HashSet<>(getConverters())); bean.afterPropertiesSet(); return bean.getObject(); } private Set<Converter<?, ?>> getConverters() { Set<Converter<?, ?>> converters = new HashSet<>(); converters.addAll(Jsr310Converters.getConvertersToRegister()); converters.add(new DateTimeWriteConverter()); converters.add(new DateTimeReadConverter()); return converters; } public static class DateTimeWriteConverter implements Converter<DateTime, Long> { @Override public Long convert(DateTime source) { return source.getMillis(); } } public static class DateTimeReadConverter implements Converter<Long, DateTime> { @Override public DateTime convert(Long source) { return new DateTime(source); } } 

}

+5
source share
1 answer

Spring Cassandra custom conversion works when you create a CassandraCustomConversions bean. Just add your own converter and the default converters will remain. Below is my @Configuration class.

 @Bean CassandraCustomConversions cassandraCustomConversions() { List<Converter<?, ?>> converters = new ArrayList<>(); converters.add(new MyDataReadConverter()); return new CassandraCustomConversions(converters); } static class CounterDataReadConverter implements Converter<ByteBuffer, MyData> { @Override public MyData convert(ByteBuffer source) { try { return MyData.parseFrom(source.array()); } catch (Exception e) { e.printStackTrace(); } return null; } } 

I am using spring-boot-starter-data-cassandra based on SpringBoot 2.0.0.RELEASE.

+1
source

Source: https://habr.com/ru/post/1240600/


All Articles