com.alibaba.fastjson2.JSONException: autoType is not support解决方法

同样问题的博文:解决com.alibaba.fastjson.JSONException:autoType is not support问题,Redis FastJson

博主使用的依赖是:

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.22</version>
        </dependency>

他的解决方案:

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
/**
 * @description 缓存配置类
 * @author ouyang
 * @version 1.0
 * @date 2023-03-14 8:25
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
 
    @Bean
    @SuppressWarnings(value = { "unchecked", "rawtypes" })
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
 
        // 解决autoType is not support.xxxx.xx的问题
        String[] acceptNames = {"org.springframework.security.core.authority.SimpleGrantedAuthority"};
        GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer(acceptNames);
        
        // 使用GenericFastJsonRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);
        // Hash的key也采用StringRedisSerializer的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
 
        template.afterPropertiesSet();
        return template;
    }
}

但我所用的依赖是:

 <!-- 阿里JSON解析器 -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.25</version>
        </dependency>

并没有这个GenericFastJsonRedisSerializer,我换了依赖测试了下,上面的解决方案成功。

但是我就是不想换依赖呢,比如我是在现有项目上开发遇到的问题,换依赖肯定不是想换就换的,上面博文有评论提到的解决方案:com.alibaba.fastjson2.JSONException: autoType is not support

我看了下,wenshao的回答bug单里面已经使用到了 ,并没有解决问题。

这个反序列失败的根本原因,我查询的一些博客说的是,序列化的这个类没有默认的无参构造方法,具体如何没有深究,于是在加了各种配置没有解决问题后,我就按这个思路包装了一下原来的类。

比如我现在是序列化Spring Security中的PersistentRememberMeToken,它确实没有无参构造,反序列时也是报了autoType is not support。

// 包装PersistentRememberMeToken 
 class MyPersistentRememberMeToken {

        private PersistentRememberMeToken token;

        public MyPersistentRememberMeToken(PersistentRememberMeToken token) {
            this.token = token;
        }

        public MyPersistentRememberMeToken() {
        }

        public PersistentRememberMeToken getToken() {
            return token;
        }

        public void setToken(PersistentRememberMeToken token) {
            this.token = token;
        }
    }

 redis存PersistentRememberMeToken 报错如下。

Caused by: com.alibaba.fastjson2.JSONException: autoType is not support. org.springframework.security.web.authentication.rememberme.PersistentRememberMeToken
	at com.alibaba.fastjson2.reader.ObjectReaderProvider.checkAutoType(ObjectReaderProvider.java:758) ~[fastjson2-2.0.25.jar:na]
	at com.alibaba.fastjson2.reader.ObjectReaderProvider.getObjectReader(ObjectReaderProvider.java:681) ~[fastjson2-2.0.25.jar:na]
	at com.alibaba.fastjson2.JSONReader$Context.getObjectReaderAutoType(JSONReader.java:3519) ~[fastjson2-2.0.25.jar:na]
	at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:111) ~[fastjson2-2.0.25.jar:na]

redis存MyPersistentRememberMeToken 即可反序列化成功。

备注:这种错误一般出现在我们往redis里面存第三方jar包中的对象,该对象一般没有无参构造,如果你是自定义的类,可以加上无参构造试试看,当然这种方案比较LOW啊,毕竟又涉及新建对象的开销。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值