当前位置: 首页 > 后端技术 > Java

Spring中国教育管理中心-ApacheCassandra之SpringData教程之十三

时间:2023-04-01 18:59:22 Java

14.5.使用自定义转换器覆盖默认映射为了更细粒度地控制映射过程,您可以使用CassandraConverter实现(例如MappingCassandraConverter)向Spring注册转换器。MappingCassandraConverterConverters在尝试映射对象本身之前首先检查是否有任何Spring可以处理特定类。要“劫持”MappingCassandraConverter的正常映射策略(可能出于性能或其他自定义映射需求),您需要创建SpringConverter接口的实现并将其注册到MappingCassandraConverter.14.5.1。使用已注册的Spring转换器可以节省您可以将转换和保存结合在一个过程中,基本上使用转换器来进行保存。以下示例使用aConverter将Person对象转换为带有Jackson2的java.lang.String:);}catch(IOExceptione){thrownewIllegalStateException(e);}}}14.5.2。使用Springconverters读取类似于合并保存和转换,您也可以将读取和转换结合起来。以下示例使用aConverter将ajava.lang.String转换为PersonJackson2对象:ObjectMapper().readValue(source,Person.class);}catch(IOExceptione){thrownewIllegalStateException(e);}}返回空值;}}14.5.3。注册SpringConverterCassandraConverterSpringDataforApacheCassandraJava配置提供了一种注册SpringConverter实例的便捷方式:MappingCassandraConverter。以下配置片段显示了如何手动注册转换器和配置CustomConversions:add(newPersonReadConverter());converters.add(newPersonWriteConverter());returnnewCassandraCustomConversions(converters);}//其他方法省略...}以下SpringConverter实现示例取自aString转自定义Email值对象:@ReadingConverterpublicclassEmailReadConverterimplementsConverter{publicEmailconvert(Stringsource){returnEmail.valueOf(source);}}编写一个转换器,其中源类型和目标类型都是本机类型,我们无法确定它应该被视为读转换器还是写转换器。将转换器实例注册为两者可能会导致不需要的结果。例如,aConverter是有歧义的,尽管在编写它时尝试将所有String实例转换为Long实例可能没有意义。为了让您强制基础设施注册一个转换器,我们只有一种方法可以在转换器实现上提供@ReadingConverter和@WritingConverter注释。转换器需要显式注册,因为实例不会从类路径或容器扫描中提取,以避免不必要的转换服务注册和此类注册的副作用。转换器将CustomConversions注册为一个中心工具,允许根据源和目标类型注册和查询已注册的转换器。CustomConversions带有一组预定义的转换器注册:JSR-310转换器,用于在java.time、java.util.Date和String类型之间进行转换。弃用:用于org.joda.time、JSR-310和java.util.Date的Joda时间转换器。已弃用:用于org.joda.time、JSR-310和java的ThreeTenBackport转换器。.util.Date.local时间类型(例如LocalDateTime到java.util.Date)的默认转换器依赖于系统默认时区设置在这些类型之间转换。您可以通过注册自己的转换器来覆盖默认转换器。转换器消歧通常,我们检查转换器实现以了解它们相互转换的源类型和目标类型。根据一个类型是否是底层数据访问API可以本地处理的类型,我们将转换器实例注册为读或写转换器。以下示例显示了一个写入和读取转换器(注意Converter上限定符顺序的不同)://写入转换器,因为只有目标类型是可以本地处理的类型classMyConverterimplementsConverter{...}//读取转换器,因为只有源类型是可以本地处理的类型classMyConverterimplementsConverter{…}14.6.实体状态检测策略下表描述了SpringData提供的检测实体是否为新实体的方法实体策略:Spring中国教育管理中心-ApacheCassandra之SpringData教程十三14.7。生命周期事件Cassandra映射框架有几个内置的org.springframework.context.ApplicationEvent事件,您的应用程序可以传入ApplicationContext。Spring的应用程序上下文事件基础设施,其他产品如SpringIntegration可以很容易地接收这些事件,因为它们是基于Spring的应用程序中众所周知的事件机制。要在对象进入数据库之前拦截对象,您可以注册org.springframework.data.cassandra.core.mapping.event.AbstractCassandraEventListener的子类,它会覆盖onBeforeSave(...)方法。当事件被调度时,你的侦听器被调用并传递域对象(它是一个Java实体)。下面的例子使用了onBeforeSave方法:SpringApplicationContext将导致在分派事件时调用它们。AbstractCassandraEventListener具有以下回调方法:onBeforeSave:在数据库中插入或更新行之前调用CassandraTemplate.insert(…)和.update(…)操作。onAfterSave:在数据库中插入或更新行后调用CassandraTemplate...insert(...)和.update(...)操作。onBeforeDelete:在从数据库中删除行之前在CassandraTemplate.delete(…)操作中调用。onAfterDelete:在从数据库中删除一行后在CassandraTemplate.delete(…)操作中调用。onAfterLoad:在从数据库中检索到每一行后,由CassandraTemplate.select(…)、.slice(…)和.stream(…)方法调用。onAfterConvert:在CassandraTemplate.select(…)将从数据库检索到的行转换为POJO之后,在.slice(…)和.stream(…)方法中调用。生命周期事件仅针对根级别类型发出。在聚合根中用作属性的复杂类型不受事件发布的影响。14.8。实体回调SpringData基础结构提供了用于在调用某些方法之前和之后修改实体的挂钩。那些所谓的EntityCallback实例提供了一种方便的方法来检查和可能修改回调样式中的实体。AnEntityCallback看起来很像专门的ApplicationListener。一些SpringData模块发布BeforeSaveEvent以允许修改给定实体的特定于存储的事件(例如)。在某些情况下,例如在使用不可变类型时,这些事件会引起麻烦。另外,事件发布依赖于ApplicationEventMulticaster。如果异步配置TaskExecutor可能会导致不可预知的结果,因为事件处理可以在线程上分叉。实体回调为同步和反应式API提供集成点,以保证处理链中定义明确的检查点按顺序执行,返回可能修改的实体或反应式包装器类型。实体回调通常由API类型分隔。这种分离意味着同步API只考虑同步实体回调,而反应式实现只考虑反应式实体回调。SpringDataCommons2.2引入了实体回调API。这是应用实体修改的推荐方法。在调用可能已注册的实例之前,ApplicationEvents仍将发布特定于现有商店的信息。实体回调