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

相关文章
|
10月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
8375 122
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1513 3
|
10月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
11月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1829 5
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
1132 13
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
904 3
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
2078 3
|
存储 安全 NoSQL
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十四
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十四
|
存储 NoSQL Java
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十二
Spring中国教育管理中心-Apache Cassandra 的 Spring 数据教程十二

热门文章

最新文章

推荐镜像

更多