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
你看下这里的第5点 https://github.com/alibaba/fastjson2/wiki/fastjson2_autotype_cn
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。