V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heliotrope
V2EX  ›  Java

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

  •  
  •   heliotrope · 17 小时 56 分钟前 · 649 次点击
    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 了 实在是没搞懂哪里有问题

    4 条回复    2025-12-16 14:10:17 +08:00
    zhady009
        1
    zhady009  
       16 小时 37 分钟前
    这个反序列化给了 Object.class 那 fastjson 默认就是用 JsonObject 或者 JsonArray 没毛病,这方法也有问题不应该给范型而是直接返回 Object ,如果要范型入参要多个 Class<T>或者 TypeRef<T>给到反序列化方法里,顺便再黑一下 ruoyi 真的是一坨
    heliotrope
        2
    heliotrope  
    OP
       16 小时 14 分钟前
    @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
        3
    LiaoMatt  
       15 小时 43 分钟前
    序列化特性: SerializerFeature.WriteClassName
    反序列化特性: Feature.SupportAutoType
    这样应该可以解析为对应类, 但是有安全问题
    heliotrope
        4
    heliotrope  
    OP
       15 小时 18 分钟前
    @LiaoMatt 感谢 可以了
    开了 AutoType 序列化也带了 Feature.SupportAutoType
    但是反序列化 没有带 Feature.SupportAutoType
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 21:28 · PVG 05:28 · LAX 13:28 · JFK 16:28
    ♥ Do have faith in what you're doing.