当前位置: 首页 > 知识库问答 >
问题:

自定义Cassandra转换器

李康安
2023-03-14

I'v开始寻找很好的解决方案,如何使用Spring CassandraOperations很好地持久化实体。问题的出现是因为我的实体中的某些字段不支持cassandra,例如joda DateTime。

解决方法是在java类型的同一实体中有其他字段。util。Date而不是joda DateTime,用@Transient标记未要求的字段。但这并不干净,所以我开始寻找自动自定义转换。

目前,spring数据cassandra参考并没有提供如何注册自定义转换器的信息。http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.custom-转换器

是否可以在CassandraSessionFactoryBean中注册自定义转换器(如此处的Spring数据Cassandra LocalDateTime转换)?

这是我的代码@Configuration公共类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);
    }
}

}

共有1个答案

宗政兴发
2023-03-14

当您创建CassandraCustomConversion bean时,Spring Cassandra的自定义转换有效。只需添加您的自定义转换器,默认转换器就会保留。下面是我的@Configuration类。

@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;
    }
}

我正在使用基于SpringBoot 2.0.0的spring-boot-starter-data-cassandra。释放。

 类似资料:
  • 主要内容:JSF自定义转换器实例我们可以在JSF中创建自己的自定义转换器。 以下列表是我们可以在JSF中创建自定义转换器的步骤。 通过实现接口创建一个转换器类。 实现上述接口的和方法。 使用注解为自定义转换器分配唯一的ID。 JSF自定义转换器实例 打开 NetBeans IDE 创建一个Web工程:CustomConverter,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文

  • 问题内容: 我正在寻找一种用于SQL中自定义单位转换的解决方案,我公司使用的数据库是Microsoft SQL Server,因此我需要编写一个SQL以返回基于“单位转换表”的转换因子 说: 单位换算表: 问题:如果我有10盒,以克为单位的鸡翅的期末存货是多少? 如何编写此sql返回“转换因子”? 提前致谢 问题答案: 我认为递归表最好找到从您期望的单位到期望的单位之间的路径。这样的事情(这假设数

  • 由来 Hutool中类型转换最早只是一个工具类,叫做“Convert”,对于每一种类型转换都是用一个静态方法表示,但是这种方式有一个潜在问题,那就是扩展性不足,这导致Hutool只能满足部分类型转换的需求。 解决 为了解决这些问题,我对Hutool中这个类做了扩展。思想如下: Converter 类型转换接口,通过实现这个接口,重写convert方法,以实现不同类型的对象转换 ConverterR

  • 我为jsf创建了一个自定义转换器。getAsObject()工作正常,但getAsString()返回异常。我不确定问题出在哪里,我尝试过用不同的方式将对象转换为字符串,但它不断返回异常。 这是我的代码: 这是Product类(为简单起见排除了getter/Setters/equals()/hash()): 这是stack我得到的: 这是我使用转换器的jsf:

  • 问题内容: 我必须处理动态JSON响应。 之前,我使用如下类和注释: 当状态为1(成功)时,将被触发,我可以得到一个ChatResponse对象。但是,当状态为0时,响应在JSON表示中为false,并且失败(触发)。 我想创建我的自定义转换器,这个问题有一个很好的示例,但是该示例适用于Retrofit 1。 我必须创建一个extends类,但是我不知道如何重写此类的方法。 其实我有下一个: 我现

  • 给定maven shade插件资源转换器,我们如何创建自定义的资源转换器? [错误]无法执行项目目标org.apache.maven.plugins:maven-shade-plugin:2.4.1:Shade(默认)foo:无法解析mojo org.apache.maven.plugins:maven-shade-plugin:2.4.1:参数转换器的Shade:无法加载实现提示“test.tr