求助 泛型转换碰到一个很奇怪的问题 Object 放 Redis 自动变成 JSONObject 了

19 小时 45 分钟前
 heliotrope
public <T> void setCacheObject(final String key, final T value)
{
	redisTemplate.opsForValue().set(key, value);	
}

public <T> T getCacheObject(final String key)
{
	ValueOperations<String, T> operation = redisTemplate.opsForValue();
    return operation.get(key);
}

这个逻辑在调用 getCacheObject 时 返回对象会随机变成 com.alibaba.fastjson.JSONObject 或者 com.alibaba.fastjson2.JSONObject 导致外部调用时报类型强制转换异常

就是 ruoyi 脚手架 里面的 RedisService TokenService 里面调用 getLoginUser 就会报 java.lang.ClassCastException: com.alibaba.fastjson2.JSONObject cannot be cast to com.ruoyi.system.api.model.LoginUser

而且之前都正常 一段时间没运行 再跑就出现这个问题 定义是在 RedisConfig

RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

全部都是 object 获取到就变 JSONObject 了 实在是没搞懂哪里有问题

665 次点击
所在节点    Java
4 条回复
zhady009
18 小时 27 分钟前
这个反序列化给了 Object.class 那 fastjson 默认就是用 JsonObject 或者 JsonArray 没毛病,这方法也有问题不应该给范型而是直接返回 Object ,如果要范型入参要多个 Class<T>或者 TypeRef<T>给到反序列化方法里,顺便再黑一下 ruoyi 真的是一坨
heliotrope
18 小时 3 分钟前
@zhady009 主要是之前是可以的
我自己搭从来不用 redisTemplate
以前用 redisTemplate 也碰到过这种问题
我都是直接丢 JSON 到 redis 拿 String 出来自己再转成 bean

这个现在是半路接手别人的项目 要修改起来 涉及的代码太多了 不然我自己就改了
Method method = RedisService.class.getMethod("getCacheObject", String.class);
Type returnType = method.getGenericReturnType();
log.info("Return Type: " + returnType);
泛型方法 拿到的这个 returnType 又是 T 想手动转也不行...
LiaoMatt
17 小时 32 分钟前
序列化特性: SerializerFeature.WriteClassName
反序列化特性: Feature.SupportAutoType
这样应该可以解析为对应类, 但是有安全问题
heliotrope
17 小时 7 分钟前
@LiaoMatt 感谢 可以了
开了 AutoType 序列化也带了 Feature.SupportAutoType
但是反序列化 没有带 Feature.SupportAutoType

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1179190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX