开发者社区> 问答> 正文

fastjson升级到fastjson2后redis json通过fastjson反序列化报错

fastjson升级到fastjson2后redis jackson通过fastjson反序列化报错

#错误

Redis使用FastJson序列化,升级到v2后反序列报错提示如下 com.alibaba.fastjson2.JSONObject cannot be cast to vip.xunman.common.core.domain.model.LoginUser LoginUser是SpringSecurity的一个实现类序列化存在redis用于身份校验

#v1和v2配置写法

FastJson2JsonRedisSerializer 的 fastjson2写法

@Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return new byte[0]; } return JSON.toJSONString(t, JSONWriter.Feature.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);
}

原本的 FastJson2JsonRedisSerializer 的 fastjson1写法

@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);
}

报错原文

java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to vip.xunman.common.core.domain.model.LoginUser at vip.xunman.framework.web.service.TokenService.getLoginUser(TokenService.java:72)

FastJson2JsonRedisSerializer的配置

package vip.xunman.framework.config;

import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONWriter; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;

/** * Redis使用FastJson序列化 * * @author xunman */ public class FastJson2JsonRedisSerializer implements RedisSerializer { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

private Class<T> clazz;

public FastJson2JsonRedisSerializer(Class<T> clazz) {
    super();
    this.clazz = clazz;
}

@Override
public byte[] serialize(T t) throws SerializationException {
    if (t == null) {
        return new byte[0];
    }
    return JSON.toJSONBytes(t, JSONWriter.Feature.WriteClassName);
}

@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);
}

}

原提问者GitHub用户hury88

展开
收起
后端老大 2023-04-21 11:02:51 641 0
1 条回答
写回答
取消 提交回答
  • 你看下这里的第5点 https://github.com/alibaba/fastjson2/wiki/fastjson2_autotype_cn

    原回答者GitHub用户wenshao

    2023-04-21 14:05:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis在唯品会的应用实践——架构演进与功能定制 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载