最近在搞毕业答辩的项目,
因为用到了Redis,
要把JPA查出来得对象给序列化到Redis里去
本来很简单,却浪费了一些时间
@Cacheable(value = {"user"}) //在Cacheable里报序列化错误 No serializer found
// for class org.hibernate.proxy.pojo.javassist.JavassistLa
@Override
public User getUserInfoByID(long ID) {
User user = _userdao.getById(ID);
return user;
}
回想了一下苏波老师给我将到的Hibernate懒加载的知识,终于明白了
repository返回的对象是一个代理对象,并不存储查询对象的值,而@Cacheable拿到的正式这个代理对象,里面的属性和原对象的属性并不相同。并带有一个hibernateLazyInitializer的属性,从而导致了序列化的错误
解决的方法是直接在Json序列化时忽略这个属性
@Entity
@ApiModel(value = "用户模型User")
@Table(name = "t_user")
@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
public class User{
同时,你的缓存配置还要开启注解支持
private RedisCacheConfiguration instanceConfig(long ttl) {
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
//开启注解支持
mapper.configure(MapperFeature.USE_ANNOTATIONS, true);
mapper.setSerializationInclusion(Include.ALWAYS);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.EVERYTHING
, JsonTypeInfo.As.PROPERTY);
serializer.setObjectMapper(mapper);
return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(ttl))
//.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(serializer)
);
}

416

被折叠的 条评论
为什么被折叠?



