记一个用Jackson序列化JPA对象的bug:No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLa

最近在搞毕业答辩的项目,
因为用到了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)
						);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马苏丹默罕默德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值