【发布时间】:2018-11-20 11:53:48
【问题描述】:
我正在尝试序列化一个 jpa 托管类 (openjpa)。
这个类包含一个集合。在运行时,这个集合的类型是 org.apache.openjpa.util.java$util$LinkedHashSet$proxy(我们使用的是 openjpa)。
Jackson 将对此进行序列化,但在反序列化时将失败,因为无法构造此类型(并且当使用 spring security 的 jackson 配置时,它未列入白名单)。
所以现在我认为解决方案是自定义序列化,以便将其序列化和反序列化为更标准的集合。反序列化时只需要实现Set即可。
我想尽量避免污染持久类(所以想使用 mixins)。
容器类是 User 类,它包含 Role 类的集合。 到目前为止,我有:
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE)
public static class UserMixin {
@JsonDeserialize(as = LinkedHashSet.class, contentAs = LinkedHashSet.class)
@JsonSerialize(as = LinkedHashSet.class, contentAs = LinkedHashSet.class, typing = Typing.DYNAMIC)
private Set<Role> roles;
}
但是当我用这个运行时,我得到了
Invalid definition for property roles (of type 'Lxxx/yyy/User;'): Can not refine serialization content type [simple type, class xxx.yyy.Role] into java.util.LinkedHashSet; types not related
而且在序列化的时候会出现这个错误。
所以它似乎不尊重设置的容器或其他东西。
【问题讨论】:
-
为什么不能构造。我刚刚成功执行了这个: new org.apache.openjpa.util.java$util$LinkedHashSet$proxy();
-
这是真的 - 这是一个有效的类等。但我怀疑它不起作用的原因是杰克逊不承认它是一个集合。它支持默认的集合类,而不是自定义的。
标签: java serialization jackson jackson2