@JsonMerge 使用 List 检查是否存在
@JsonMerge check existence with List
我们正在实施 Jackson 2.9 的 @JsonMerge 注释。
根据文档 "Merging of Collections is simple: entries are appended; no checks for existence applied"。
但是,因为我们是合并JPA实体,所以我们不能使用Set(由于延迟加载的问题),我们必须使用List。
问题是,我们如何在使用集合时检查是否存在?
我们最终通过实现自定义集合反序列化器解决了这个问题,该反序列化器只是从集合中删除 "duplicate" 对象。
我不认为它是理想的,但非常适合我们的需要。
在这里发布代码以防其他人使用。
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);
}
我们正在实施 Jackson 2.9 的 @JsonMerge 注释。
根据文档 "Merging of Collections is simple: entries are appended; no checks for existence applied"。
但是,因为我们是合并JPA实体,所以我们不能使用Set(由于延迟加载的问题),我们必须使用List。
问题是,我们如何在使用集合时检查是否存在?
我们最终通过实现自定义集合反序列化器解决了这个问题,该反序列化器只是从集合中删除 "duplicate" 对象。
我不认为它是理想的,但非常适合我们的需要。
在这里发布代码以防其他人使用。
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);
}