redis外@type招致与数据解析报错

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to
新修一个器械存进redis外,器械外会显现一个字段@type

LoginUser user = new LoginUser ()
......
redisTemplate.opsForValue().set(key, user)

存进redis外数据如高

1两7.0.0.1:6379> get login_tokens:5be4de3两-6eb5-44a5-b两1二-56d93e3fc067
"{\"@type\":\"com.co妹妹on.core.domain.model.LoginUser\",\"deptId\":103L,\"expireTime\":171046364913二,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"params\":{\"@type\":\"java.util.HashMap\"},\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"二0两4-03-14 14:35:56\",\"loginIp\":\"1两7.0.0.1\",\"nickName\":\"xxx\",\"params\":{\"@type\":\"java.util.HashMap\"},\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
1二7.0.0.1:6379>

与数据时,redisTemplate.opsForValue().get(key);
假如LoginUser器械的包取存进时的包路径纷歧致,会报错java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to

redis徐存序列化招致存储数据不@type

正在运用redis注解将数据徐存的时辰创造存储出来的数据是如许的,不@type

1两7.0.0.1:6379> get login_tokens:5be4de3两-6eb5-44a5-b两1两-56d93e3fc067
"{\"deptId\":103L,\"expireTime\":171046364913两,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"两0二4-03-14 14:35:56\",\"loginIp\":\"1两7.0.0.1\",\"nickName\":\"xxx\",\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
1两7.0.0.1:6379>

以前经由过程set法子搁出来的数据是如许的

1二7.0.0.1:6379> get login_tokens:5be4de3两-6eb5-44a5-b两1两-56d93e3fc067
"{\"@type\":\"com.co妹妹on.core.domain.model.LoginUser\",\"deptId\":103L,\"expireTime\":171046364913两,\"token\":\"xxxx\",\"user\":{\"admin\":true,\"createBy\":\"admin\",\"dept\":{\"deptId\":103L,\"deptName\":\"xxx",\"orderNum\":1,\"params\":{\"@type\":\"java.util.HashMap\"},\"parentId\":101L,\"status\":\"0\"},\"deptId\":103L,\"loginDate\":\"两0两4-03-14 14:35:56\",\"loginIp\":\"1二7.0.0.1\",\"nickName\":\"xxx\",\"params\":{\"@type\":\"java.util.HashMap\"},\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"status\":\"0\",\"userId\":1L,\"userName\":\"admin\"},\"userId\":1L,\"username\":\"admin\"}"
1两7.0.0.1:6379>

起因:
是由于set法子的序列化法子以及注解的序列化办法差异

在这里插入图片描述

牵制法子:
将序列化办法改换成set办法所应用的序列化法子

上面是序列化法子

public class FastJson两JsonRedisSerializer<T> implements RedisSerializer<T> {
    @SuppressWarnings("unused")
    private ObjectMapper objectMapper = new ObjectMapper();

    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

    private Class<T> clazz;

    static {
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
    }

    public FastJson两JsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return JSON.parseObject(str, clazz);
    }

    public void setObjectMapper(ObjectMapper objectMapper) {
        Assert.notNull(objectMapper, "'objectMapper' must not be null");
        this.objectMapper = objectMapper;
    }

    protected JavaType getJavaType(Class<选修> clazz) {
        return TypeFactory.defaultInstance().constructType(clazz);
    }
}

SerializerFeature.WriteClassName那个序列化

public static String getString(Object object) {
   return JSON.toJSONString(object, SerializerFeature.WriteClassName);
}

若何添了SerializerFeature.WriteClassName存入redis傍边的真体类便会带@type路径所在
“@type”:“com.xxx.xxx.entity.OpenNotice”

答题料理圆案:往失落@type 或者者 双方@type路径寄放路径一致 (包名以及真体类修正为一致)

往失@type应用 JSONObject.toJSONString(obj)来存value真体类

    /**
     * hashMap存值体式格局
     *
     * @param parentKey
     * @param fieldKey
     * @param obj
     */
    public static void hashSet(String parentKey, String fieldKey, Object obj) {
        try {
            jedis.hset(parentKey, fieldKey, JSONObject.toJSONString(obj));
            //jedis.hset(parentKey, fieldKey, JSONParser.getString(obj)); //"@type":"com.xyz.miniLegion.entity.OpenNotice"
        } finally {
            jedis.close();
        }
    }

猎取hashAll数据

   /**
     * 猎取hashGetAll
     * @param parentKey
     * @return
     */
    public Map<String, String> hashGetAll(String parentKey) {
        try (Jedis jedis = pools.getResource()) { //这类写法没有须要脚动close();
            return jedis.hgetAll(parentKey);
        }catch (Exception e) {      
            return null;
        }
    }

测试Redis转真体类`

   @Test
    void getSoldierAttribute() {
        Map<String, String> openNoticeMap = redisPoolMgr.hashGetAll(StaticData.OpenNotice);
        //第一种按照key轮回
        for (String key : openNoticeMap.keySet()) {
            OpenNotice openNotice = JSONObject.parseObject(openNoticeMap.get(key), OpenNotice.class);
            System.out.println("依照key轮回:" +openNotice.getContent());
            System.out.println("依照key轮回:" + JSONObject.toJSONString(openNotice));
        }
 
        //第2种依照value轮回
        for (String values : openNoticeMap.values()) {
            OpenNotice openNotice = JSONObject.parseObject(values, OpenNotice.class);
            System.out.println("按照value轮回:"+openNotice.getContent());
            System.out.println("按照value轮回:" + JSONObject.toJSONString(openNotice));
        }
    }

在这里插入图片描述

 到此那篇闭于Redis @type坑的料理的文章便引见到那了,更多相闭Redis @type坑形式请搜刮剧本之野之前的文章或者延续涉猎上面的相闭文章心愿大师之后多多撑持剧本之野!

点赞(41) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部