1. 报错信息:
- 使用Redis代替session做缓存时,需要将redis中未命中的数据,从数据库查出再存入redis缓存
- 首先得将对象转为hashmap(这里使用得是hutool的BeanUtil)
- 且使用
StringRedisTemplateredis 需要转换成的map的各个字段都是String类型!而bean的各个字段类型各不相同 - 如何在不遍历map(繁琐)的情况下,在转换为map时就直接将字段类型也转换为String?
Map<String, Object> map = BeanUtil.beanToMap(shop,new HashMap<>(),
CopyOptions.create().
setIgnoreNullValue(true)
.setFieldValueEditor((fieldName,fieldValue) -> fieldValue.toString()));
stringRedisTemplate.opsForHash().putAll(RedisConstants.CACHE_SHOP_KEY + id,map);
hutool的BeanUtil提供了CopyOptions可以在转换时,做自定义规则 https://apidoc.gitee.com/dromara/hutool/
- 但是执行报错:
java.lang.NullPointerException: null
at com.hmdp.service.impl.ShopServiceImpl.lambda$queryById$0(ShopServiceImpl.java:81) ~[classes/:na]
at cn.hutool.core.bean.copier.CopyOptions.editFieldValue(CopyOptions.java:258) ~[hutool-all-5.7.17.jar:na]
at cn.hutool.core.bean.copier.BeanCopier.lambda$beanToMap$1(BeanCopier.java:233) ~[hutool-all-5.7.17.jar:na]
at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) ~[na:1.8.0_181]
at cn.hutool.core.bean.BeanUtil.descForEach(BeanUtil.java:182) ~[hutool-all-5.7.17.jar:na]
at cn.hutool.core.bean.copier.BeanCopier.beanToMap(BeanCopier.java:195) ~[hutool-all-5.7.17.jar:na]
at cn.hutool.core.bean.copier.BeanCopier.copy(BeanCopier.java:106) ~[hutool-all-5.7.17.jar:na]
at cn.hutool.core.bean.BeanUtil.beanToMap(BeanUtil.java:690) ~[hutool-all-5.7.17.jar:na]
- 空指针异常!
2. 原因分析:
- 发现需要转成map得bean中有字段是null
- 而null不能toString()
- 借鉴了hutool作者给的案例:https://toscode.gitee.com/dromara/hutool/issues/I4E08T
3. 解决方法:
Map<String, Object> map = BeanUtil.beanToMap(shop,new HashMap<>(),
CopyOptions.create().
setIgnoreNullValue(true)
.setFieldValueEditor((fieldName,fieldValue) -> fieldValue + ""));
stringRedisTemplate.opsForHash().putAll(RedisConstants.CACHE_SHOP_KEY + id,map);
|