zoukankan      html  css  js  c++  java
  • 关于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);
            }
        }
  • 相关阅读:
    div标签和span标签的简单区别
    方法重载的好处及区别
    异步计算工具
    设置"用于统计的冗余字段"要谨慎
    如何建立索引
    NFS,Memcached,Tokyo tyrant实现session共享性能测试
    mysql cache功能小记
    PHP程序员也要学会使用“异常”
    xdebug: var_dump函数设置
    用shell写个简单的log监控程序
  • 原文地址:https://www.cnblogs.com/minjay/p/8134978.html
Copyright © 2011-2022 走看看