spring boot 集成redis缓存管理序列化问题
提示:这里简述项目相关背景:
Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is java.io.InvalidClassException: top.bjy.common.tool.result.R; class invalid for deserialization
问题描述
例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
@Cacheable(cacheNames = ["car"])
@GetMapping("/manage")
fun m1(name:String) :R<*>{
println("执行。。。。")
val obj = Book()
obj.name=name
obj.price=25.6
return R.data(obj)
}
原因分析:
R没有实现序列化接口
kotlin的使用不够6
解决方案:
1、实体类必须添加open关键字
open class Book:Serializable {
var id:Int?=null
var name:String=""
var price:Double= 0.0
}
2、以主构造方法写的实体类,则每个属性必须要有默认值
即必须要有无惨构造方法
open class Car(
var id:Int?=null,
var name:String="",
var price:Double= 0.0):Serializable
3、实体类必须实现Serializable接口(包括通用返回值R)
4、 配置时传入DefaultTyping.EVERYTHING参数
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.EVERYTHING, JsonTypeInfo.As.PROPERTY);
详细配置
@Bean
fun redisSerializer(): RedisSerializer<Any> {
val jackson2JsonRedisSerializer = Jackson2JsonRedisSerializer(Any::class.java)
val objectMapper = ObjectMapper()
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.EVERYTHING, JsonTypeInfo.As.PROPERTY);
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS)
//取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
objectMapper.setDateFormat(SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
jackson2JsonRedisSerializer.setObjectMapper(objectMapper)
return jackson2JsonRedisSerializer
}