[英]@JsonMerge check existence with List
我们正在实现Jackson 2.9的@JsonMerge批注。
按照文档“集合的合并很简单:附加条目;不应用对存在性的检查”。
但是,由于我们要合并JPA实体,因此不能使用Set(由于延迟加载的问题),必须使用List。
问题是,使用集合时如何检查是否存在?
最后,我们通过实现一个自定义的集合反序列化器解决了这一问题,该反序列化器仅从集合中删除“重复”对象。
我认为这并不理想,但可以完美满足我们的需求。
在这里发布代码,以防他人使用。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.