使用JSON注释更改返回类型

时间:2016-09-15 09:07:28

标签: java json hibernate jackson

我有以下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。

知道如何在不更换字符串的情况下解决这个问题吗?

2 个答案:

答案 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);