关于spring data redis repository @RedisHash注解的对象上有DateTime属性字段的问题
当你save保存的时候你会发现出现StackOverflow Exception,很明显出现了无限循环,可是仅仅是一个save操作,哪里来的无限循环呢?
最终发现就是DateTime导致的,因为将对象映射存为Hash会将对象上的每一个属性存为hashkey,而且属性要是基本类型,
,看图就知道问题咋来的了,Datetime上的属性是无限嵌套的.
怎么解决?
@WritingConverter
public static class DateTimeToStringConvert implements Converter<DateTime, Map<String, String>> {
@Override
public Map<String, String> convert(DateTime source) {
Map<String, String> data = new HashMap<>();
data.put("value", source.toString());
return data;
}
} @ReadingConverter
public static class StringToDateTimeConvert implements Converter<Map<String, Object>, DateTime> {
@Override
public DateTime convert(Map<String, Object> source) {
if (source.containsKey("value")) {
String dateStr = new String((byte[]) source.get("value"));
return DateTime.parse(dateStr);
}
return null;
}
}
需要自定义write与read的转换器,然后你需要将该注册器注入到spring data和spring data redis的convert中去
@Configuration
static class RedisConvertConfig{ @Autowired
public MappingRedisConverter mappingRedisConverter; @PostConstruct
public void initialConverter() {
ConversionService conversionService = mappingRedisConverter.getConversionService();
mappingRedisConverter.setCustomConversions(customConversions());
if (conversionService instanceof GenericConversionService) {
((GenericConversionService) conversionService).addConverter(new DateTimeStringConvert.DateTimeToStringConvert());
((GenericConversionService) conversionService).addConverter(new DateTimeStringConvert.StringToDateTimeConvert());
}
} public CustomConversions customConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new DateTimeStringConvert.DateTimeToStringConvert());
converterList.add(new DateTimeStringConvert.StringToDateTimeConvert());
return new CustomConversions(converterList);
}
}
关于spring data redis repository @RedisHash注解的对象上有DateTime属性字段的问题的更多相关文章
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring data redis的一个bug
起因 前两天上线了一个新功能,导致线上业务的缓存总是无法更新,报错也是非常奇怪,redis.clients.jedis.exceptions.JedisConnectionException: Unk ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring Data Redis 详解及实战一文搞定
SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...
- Spring Data Redis示例
说明 关于Redis:一个基于键值对存储的NoSQL内存数据库,可存储复杂的数据结构,如List, Set, Hashes. 关于Spring Data Redis:简称SDR, 能让Spring应用 ...
随机推荐
- java POJO中 Integer 和 int 的不同,用int还是用Integer
https://www.jianshu.com/p/ff535284916f [int和Integer的区别] int是java提供的8种原始类型之一,java为每个原始类型提供了封装类,Intege ...
- Linux上天之路(十六)之Shell编程一
用户在命令行输入命令后,一般情况下Shell会fork并exec该命令,但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程.以前学过的cd.alias.u ...
- 07.python函数作用域global、nonlocal、LEGB
函数作用域 作用域 一个标识符的课件范围,这就是标识符的作用域,一般常说的是变量的作用域 def foo(): x = 100 print(x) # 可以访问到吗 上例中x不可以访问到,会抛出异 ...
- Android中添加监听回调接口的方法
在Android中,我们经常会添加一些监听回调的接口供别的类来回调,比如自定义一个PopupWindow,需要让new这个PopupWindow的Activity来监听PopupWindow中的一些组 ...
- RHCSA 第七天
1.创建文件,并赋予权限611(两种方式,一种guoa,一种nnn) 2.创建目录,并赋予权限755(两种方式,一种guoa,一种nnn) 3.创建文件,并将文件的属主和属组修改其他用户 4.设置su ...
- 个人作业2-Java代码实现数据检索并实现可视化
1.bean实体层 package bean; public class Bean { private String title; private String Abstract; private S ...
- 【记录一个问题】go.mod中使用replace后,编译出现神奇的错误:
biz\child.go:5:2: imported and not used: "xxx.com/start/common/src/polaris" as biz biz\chi ...
- Express框架的简单使用
Express框架的简单使用 这个框架是基于Node.js的框架平台 需要先安装node.js 安装完node.js后使用指令操作 npm init --yes 初始化 npm i express 安 ...
- Activity Fragment Service生命周期图
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...
- Redis持久化----RDB和AOF 的区别
关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据.缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务 ...