百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十三

toyiye 2024-06-21 12:18 6 浏览 0 评论

14.5.使用自定义转换器覆盖默认映射

要对映射过程进行更细粒度的控制,您可以Converters使用 CassandraConverter实现注册 Spring ,例如MappingCassandraConverter.

MappingCassandraConverterConverters在尝试映射对象本身之前,首先检查是否有任何 Spring可以处理特定的类。要“劫持” MappingCassandraConverter(可能是为了提高性能或其他自定义映射需求)的正常映射策略,您需要创建 SpringConverter接口的实现并将其注册到MappingCassandraConverter.

14.5.1.使用注册的 Spring 转换器进行保存

您可以在一个过程中将转换和保存结合起来,基本上是使用转换器来进行保存。

以下示例使用 aConverter将Person对象转换为java.lang.String 带有 Jackson 2 的 a:

class PersonWriteConverter implements Converter<Person, String> {

  public String convert(Person source) {

    try {
      return new ObjectMapper().writeValueAsString(source);
    } catch (IOException e) {
      throw new IllegalStateException(e);
    }
  }
}

14.5.2.使用 Spring 转换器读取

与结合保存和转换的方式类似,您也可以结合阅读和转换。

以下示例使用 aConverter将 ajava.lang.String转换为PersonJackson 2的对象:

class PersonReadConverter implements Converter<String, Person> {

  public Person convert(String source) {

    if (StringUtils.hasText(source)) {
      try {
        return new ObjectMapper().readValue(source, Person.class);
      } catch (IOException e) {
        throw new IllegalStateException(e);
      }
    }

    return null;
  }
}

14.5.3.注册 Spring 转换器CassandraConverter

Spring Data for Apache Cassandra Java 配置提供了一种注册 SpringConverter实例的便捷方法: MappingCassandraConverter. 以下配置片段显示了如何手动注册转换器以及配置CustomConversions:

@Configuration
public class ConverterConfiguration extends AbstractCassandraConfiguration {

  @Override
  public CassandraCustomConversions customConversions() {

    List<Converter<?, ?>> converters = new ArrayList<>();

    converters.add(new PersonReadConverter());
    converters.add(new PersonWriteConverter());

    return new CassandraCustomConversions(converters);
  }

  // other methods omitted...

}

以下 SpringConverter实现示例从 aString转换为自定义Email值对象:

@ReadingConverter
public class EmailReadConverter implements Converter<String, Email> {

  public Email convert(String source) {
    return Email.valueOf(source);
  }
}

如果您编写Converter的源类型和目标类型均为本机类型,我们无法确定是否应将其视为读取转换器或写入转换器。将转换器实例注册为两者可能会导致不需要的结果。例如, aConverter<String, Long>是不明确的,尽管在编写时尝试将所有String实例转换为Long实例可能没有意义。为了让你强制基础设施注册一个转换器,只有一个办法,我们提供@ReadingConverter并@WritingConverter在转换器实现使用注解。

转换器需要进行显式注册,因为不会从类路径或容器扫描中提取实例,以避免不必要的转换服务注册以及此类注册产生的副作用。转换器注册CustomConversions为中央工具,允许根据源和目标类型注册和查询已注册的转换器。

CustomConversions 附带一组预定义的转换器注册:

  • JSR-310 转换器,用于在java.time,java.util.Date和String类型之间进行转换。
  • 不推荐使用:Joda 时间转换器,用于在org.joda.time、JSR-310 和java.util.Date.
  • 已弃用:ThreeTenBackport 转换器,用于在org.joda.time、JSR-310 和java.util.Date.

本地时间类型(例如LocalDateTimeto java.util.Date)的默认转换器依赖于系统默认时区设置在这些类型之间进行转换。您可以通过注册您自己的转换器来覆盖默认转换器。

转换器消歧

通常,我们会检查Converter它们相互转换的源和目标类型的实现。根据其中一个是否是底层数据访问 API 可以本地处理的类型,我们将转换器实例注册为读取或写入转换器。以下示例显示了一个写入和读取转换器(注意区别在于 上的限定符的顺序Converter):

// Write converter as only the target type is one that can be handled natively
class MyConverter implements Converter<Person, String> { … }

// Read converter as only the source type is one that can be handled natively
class MyConverter implements Converter<String, Person> { … }

14.6.实体状态检测策略

下表描述了 Spring Data 提供的用于检测实体是否为新实体的策略:

14.7.生命周期事件

Cassandra 映射框架有几个内置org.springframework.context.ApplicationEvent事件,您的应用程序可以通过在ApplicationContext. 由于基于 Spring 的应用程序上下文事件基础结构,其他产品(例如 Spring Integration)可以轻松接收这些事件,因为它们是基于 Spring 的应用程序中众所周知的事件机制。

要在对象进入数据库之前对其进行拦截,您可以注册一个org.springframework.data.cassandra.core.mapping.event.AbstractCassandraEventListener覆盖该onBeforeSave(…)方法的子类。当事件被调度时,你的监听器被调用并传递域对象(它是一个 Java 实体)。以下示例使用该onBeforeSave方法:

class BeforeSaveListener extends AbstractCassandraEventListener<Person> {
  @Override
  public void onBeforeSave(BeforeSaveEvent<Person> event) {
    // … change values, delete them, whatever …
  }
}

在 Spring 中声明这些 beanApplicationContext将导致在调度事件时调用它们。

将AbstractCassandraEventListener具有以下回调方法:

  • onBeforeSave:在插入或更新数据库中的行之前调用CassandraTemplate.insert(…)和.update(…)操作。
  • onAfterSave: 在数据库中插入或更新行后调用CassandraTemplate…insert(…)和.update(…)操作。
  • onBeforeDelete: 在CassandraTemplate.delete(…)从数据库中删除行之前的操作中调用。
  • onAfterDelete:CassandraTemplate.delete(…)从数据库中删除行后在操作中调用。
  • onAfterLoad:从数据库中检索每一行后CassandraTemplate.select(…),在.slice(…)、 和.stream(…)方法中调用。
  • onAfterConvert:将从数据库中检索到的行转换为 POJO 后CassandraTemplate.select(…),在.slice(…)、 和.stream(…)方法中调用。

仅针对根级别类型发出生命周期事件。在聚合根中用作属性的复杂类型不受事件发布的影响。

14.8.实体回调

Spring Data 基础设施提供了在调用某些方法之前和之后修改实体的钩子。那些所谓的EntityCallback实例提供了一种方便的方法来检查和潜在地以回调风格修改实体。
AnEntityCallback看起来很像一个专门的ApplicationListener. 一些 Spring Data 模块发布BeforeSaveEvent允许修改给定实体的存储特定事件(例如)。在某些情况下,例如使用不可变类型时,这些事件可能会导致麻烦。此外,事件发布依赖于ApplicationEventMulticaster. 如果使用异步配置TaskExecutor它可能会导致不可预测的结果,因为事件处理可以分叉到线程上。

实体回调为同步 API 和反应式 API 提供集成点,以保证在处理链中定义明确的检查点按顺序执行,返回潜在修改的实体或反应式包装器类型。

实体回调通常按 API 类型分隔。这种分离意味着同步 API 仅考虑同步实体回调,而反应式实现仅考虑反应式实体回调。

Spring Data Commons 2.2 引入了实体回调 API。这是应用实体修改的推荐方式。在调用可能已注册的实例之前,ApplicationEvents仍会发布特定于现有商店的信息。EntityCallback

内容来源:Spring中国教育管理中心(Spring认证)

2021年2月,VMware公司正式与北京中科卓望网络科技有限公司(以下简称:中科卓望)达成战略合作,授予其 Spring 中国教育管理中心,携手 VMware 全球最新 Spring技术和认证体系,帮助中国院校构建专业教学内容,全面赋能未来开发人

#java#

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码