同样问题的博文:解决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啊,毕竟又涉及新建对象的开销。