如果我有课
class DTO {
final MySet<Types> values = MySetWrapper(EnumSet.of(Types.class));
public MySet getValues() {
return values;
}
}
其中MySet
扩展了Set
。 jackson 提示说
Cannot find a deserializer for non-concrete Collection type MySet
我明白,但我已经实例化了该集合。我想要的是 Jackson 在创建实例后为每个值调用 add
,如下所示:
DTO o = new DTO();
MySet<Types> values = o.getValues();
for (Types type : jsonArray) {
values.add(type );
}
我不希望它尝试自行创建新集合。
最佳答案
该错误消息意味着 DTO
类被配置(默认或显式)以反序列化 values
输入到 DTO 的 JSON 的一部分 values
DTO
领域:
Cannot find a deserializer for non-concrete Collection type MySet
如果您认为 Jackson 不应该直接在此字段上执行反序列化,您可以定义一个构造函数来设置 values
并且还要确保 Jackson 不会自动执行反序列化工作:要实现它,请删除该字段的 setter(或在其上添加 @JsonIgnore
)以及任何将使用反射反序列化到字段的 Jackson 模块。
它会给出:
final MySet<Types> values = MySetWrapper(EnumSet.of(Types.class));
@JsonCreator
public MyFoo(Set<Types> values) {
this.values.addAll(values);
}
请注意,我在构造函数中指定了 Set
而不是MySet
(不应该成为问题,因为接口(interface)没有声明字段),否则您会遇到相同的问题,因为您没有为 MySet
定义反序列化器.
但如果你为此实现一个反序列化器,你当然可以这样做:
public MyFoo(MySet<Types> values) {
this.values.addAll(values);
}
关于java - 使用实例化的集合类型进行 jackson 反序列化而不是初始化一个新的集合类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57292438/