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

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

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

}
}
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十三
如果您编写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 提供的用于检测实体是否为新实体的策略:

Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十三
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 {
@Override
public void onBeforeSave(BeforeSaveEvent 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

相关文章
|
27天前
|
消息中间件 Java Kafka
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
Spring Boot 与 Apache Kafka 集成详解:构建高效消息驱动应用
40 1
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
119 2
|
2月前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
43 9
|
2月前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
94 2
|
3月前
|
XML JavaScript Java
Spring Retry 教程
Spring Retry 是 Spring 提供的用于处理方法重试的库,通过 AOP 提供声明式重试机制,不侵入业务逻辑代码。主要步骤包括:添加依赖、启用重试机制、设置重试策略(如异常类型、重试次数、延迟策略等),并可定义重试失败后的回调方法。适用于因瞬时故障导致的操作失败场景。
Spring Retry 教程
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
详细介绍实现Java Spring Boot FCM推送教程
114 0
|
4月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
48 0
|
4月前
|
Java Spring 开发者
掌握Spring事务管理,打造无缝数据交互——实用技巧大公开!
【8月更文挑战第31天】在企业应用开发中,确保数据一致性和完整性至关重要。Spring框架提供了强大的事务管理机制,包括`@Transactional`注解和编程式事务管理,简化了事务处理。本文深入探讨Spring事务管理的基础知识与高级技巧,涵盖隔离级别、传播行为、超时时间等设置,并介绍如何使用`TransactionTemplate`和`PlatformTransactionManager`进行编程式事务管理。通过合理设计事务范围和选择合适的隔离级别,可以显著提高应用的稳定性和性能。掌握这些技巧,有助于开发者更好地应对复杂业务需求,提升应用质量和可靠性。
52 0
|
11天前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
291 33
The Past, Present and Future of Apache Flink
|
2月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
845 13
Apache Flink 2.0-preview released

推荐镜像

更多