我们正在实施Jackson 2.9的@JsonMerge注释。
根据文档"合并集合很简单:附加条目;没有应用存在的检查"。
但是,因为我们正在合并JPA实体,所以我们不能使用Set(由于延迟加载的问题),我们必须使用List。
问题是,在使用Collection时我们如何检查是否存在?
答案 0 :(得分:0)
我们最终通过实现自定义集合反序列化器来解决这个问题,该解集器只是从集合中删除“重复”对象。
我不认为这是理想的,但完全符合我们的需求。
在此处发布代码,以防其他人使用。
public class UniqueCollectionDeserializer extends CollectionDeserializer {
public UniqueCollectionDeserializer(
JavaType collectionType,
JsonDeserializer<Object> valueDeser,
TypeDeserializer valueTypeDeser,
ValueInstantiator valueInstantiator
) {
super(collectionType, valueDeser, valueTypeDeser, valueInstantiator);
}
protected UniqueCollectionDeserializer(
JavaType collectionType,
JsonDeserializer<Object> valueDeser,
TypeDeserializer valueTypeDeser,
ValueInstantiator valueInstantiator,
JsonDeserializer<Object> delegateDeser,
NullValueProvider nuller,
Boolean unwrapSingle
) {
super(collectionType, valueDeser, valueTypeDeser, valueInstantiator, delegateDeser, nuller, unwrapSingle);
}
public UniqueCollectionDeserializer(CollectionDeserializer defaultDeserializer) {
super(defaultDeserializer);
}
@Override
public Collection<Object> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {
return removeDuplicates(super.deserialize(jsonParser, context));
}
@Override
public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt, Collection<Object> result) throws IOException {
return removeDuplicates(super.deserialize(p, ctxt, result));
}
@SuppressWarnings("unchecked")
@Override
protected CollectionDeserializer withResolved(
JsonDeserializer<?> dd,
JsonDeserializer<?> vd,
TypeDeserializer vtd,
NullValueProvider nuller,
Boolean unwrapSingle
) {
return new UniqueCollectionDeserializer(_containerType, (JsonDeserializer<Object>) vd, vtd, _valueInstantiator, (JsonDeserializer<Object>) dd, nuller, unwrapSingle);
}
private Collection<Object> removeDuplicates(Collection<Object> data) {
return data.stream()
.distinct()
.collect(Collectors.toList());
}
}
从BeanDeserializerModifier中调用它,如下所示:
public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config, CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
return new UniqueCollectionDeserializer((CollectionDeserializer) deserializer);
}