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