杰克逊反序列化期间属性的动态过滤

我有一个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

回到顶部