我有以下hibernate类
@Entity
class A {
List<String> list;
...
List<String> getList();
}
在hibernate实例化和Jackson序列化之后,getList()
方法被序列化为org.hibernate.collection.internal.PersistentBag
。
在反序列化期间,我得到以下异常:com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection, could not initialize proxy...
如果我将序列化字符串(使用简单的String.replaceAll ...)从org....PersistentBag
替换为java....List
类型,则对象将根据需要进行反序列化。
同样适用于hibernate的PersistentSet和java的HashSet。
知道如何在不更换字符串的情况下解决这个问题吗?
答案 0 :(得分:0)
我对序列化为shift_expr
的{{1}}有相同的问题。
我使用Mixin和用于Set
的自定义反序列化程序解决了该问题,将PersistentSet
反序列化为Set
。
相同的方法应适用于PersistentSet
-HashSet
。
SetMixin:
List
SetDeserializer:
PersistentBag
将SetMixin添加到ObjectMapper:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)
@JsonDeserialize(using = SetDeserializer.class)
public abstract class SetMixin {
@JsonCreator
public SetMixin(Set<?> s) {
}
}
答案 1 :(得分:0)
可以使用通用转换器,在序列化之前将休眠内部列表转换为arraylist。反序列化时,我们会自动获得一个数组列表
@JsonSerialize(converter = PersistenceBagConverter.class)
private List<SomeObjectType> options;
public class PersistenceBagConverter<T> extends StdConverter<PersistentBag, Collection<T>> {
@Override
public Collection<T> convert(PersistentBag value) {
return value != null ? new ArrayList<T>(value) : new ArrayList<>();
}
}
对象映射器如下:
ObjectMapper mapper = new ObjectMapper()
mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);