杰克逊反序列化期间属性的动态过滤
我有一个REST WS来更新一个接收JSON字符串作为输入的bean对象。
ABean entity = svc.findEntity(...);objectMapper.readerForUpdating(entity).readValue(json);
[...]
svc.save(entity);
例如:
class ABean { public BBean b;
public CBean c;
public String d;
}
svc.save(…) 。
出于安全原因,我想过滤掉一些可以由JSON字符串更新的属性,但是我想动态地做到这一点,以便对于每个WS(或用户角色),我都可以决定阻止哪些属性被更新(所以我不能简单地使用杰克逊景观)
总而言之,有什么方法可以在JSON反序列化期间动态过滤掉属性?
回答:
另一种方法是使用BeanDeserializerModifier:
private static class BeanDeserializerModifierForIgnorables extends BeanDeserializerModifier { private java.lang.Class<?> type;
private List<String> ignorables;
public BeanDeserializerModifierForIgnorables(java.lang.Class clazz, String... properties) {
ignorables = new ArrayList<>();
for(String property : properties) {
ignorables.add(property);
}
this.type = clazz;
}
@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config, BeanDescription beanDesc,
BeanDeserializerBuilder builder) {
if(!type.equals(beanDesc.getBeanClass())) {
return builder;
}
for(String ignorable : ignorables) {
builder.addIgnorable(ignorable);
}
return builder;
}
@Override
public List<BeanPropertyDefinition> updateProperties(
DeserializationConfig config, BeanDescription beanDesc,
List<BeanPropertyDefinition> propDefs) {
if(!type.equals(beanDesc.getBeanClass())) {
return propDefs;
}
List<BeanPropertyDefinition> newPropDefs = new ArrayList<>();
for(BeanPropertyDefinition propDef : propDefs) {
if(!ignorables.contains(propDef.getName())) {
newPropDefs.add(propDef);
}
}
return newPropDefs;
}
}
您可以使用以下命令将修改器注册到ObjectMapper:
BeanDeserializerModifier modifier = new BeanDeserializerModifierForIgnorables(YourType.class, "name");DeserializerFactory dFactory = BeanDeserializerFactory.instance.withDeserializerModifier(modifier);
ObjectMapper mapper = new ObjectMapper(null, null, new DefaultDeserializationContext.Impl(dFactory));
然后定义的属性将被忽略。如果使用@JsonAnySetter批注,则可以忽略updateBuilder方法。
马丁问候
以上是 杰克逊反序列化期间属性的动态过滤 的全部内容, 来源链接: utcz.com/qa/403654.html