我有一个问题与Objectmapper.readerforupdating使用不同的写权限的帮助下的意见,它是工作的罚款对主要实体,但不对嵌套对象。我有下面的例子:
public class A {
@JsonView(value={WritePermission.Admin})
private String name;
@JsonView(value={WritePermission.User})
private String property;
@JsonView(value={WritePermission.User})
private List<B> list;
}
public class B {
@JsonView(value={WritePermission.Admin})
private String name;
@JsonView(value={WritePermission.User})
private String property;
}
public class WritePermission {
public WritePermission() {
}
public static class Admin extends WritePermission.User {
public Admin() {
}
}
public static class User {
public User() {
}
}
}
对于反序列化,我使用以下命令:objectMapper.readerForUpdating(initialEntityOfAClass).withView(WritePermission.User.class).forType(A.class).readValue(json)并尝试了这个,但我得到了相同的结果:ObjectReader objectReader = objectMapper.readerForUpdating(initialEntityOfAClass);
当我想反序列化一个具有User write角色的json时,我想只覆盖我有权限的属性,这对于类A的属性很好用(在name属性中仍然是旧值,因为我没有更新的权限,property属性已更新)但它不适用于B项列表-而不是像A一样更改B对象(name保持旧值,property从json更新)为B的列表创建新对象,name保持null,因为作为用户,我没有权限将值写入name属性。如果我在B列表上设置@JsonMerge,而不是合并,我会在一个列表中获得旧的(已经设置了名称但属性未更改的对象)和新创建的对象(属性更改但名称为null的对象)。有人能帮帮我吗?
1条答案
按热度按时间j5fpnvbx1#
这里有两个问题。第一个问题是
com.fasterxml.jackson.databind.deser.impl.MethodProperty
在存在read方法时不阅读属性值。所以嵌套对象的反序列化总是从null
值开始,因此首先构造一个新示例。另一个问题是处理已经是列表一部分的集合元素。
要解决第一个问题,请执行以下操作:
com.fasterxml.jackson.databind.deser.SettableBeanProperty
实现,如果存在read方法,它将读取属性值,然后使用该值作为反序列化的基础:com.fasterxml.jackson.databind.deser.BeanDeserializerModifier
修改com.fasterxml.jackson.databind.deser.BeanDeserializer
的属性,以便在存在属性读取方法的情况下使用上述实现请注意,这只适用于方法属性,而不适用于构造函数属性。
关于第二个问题,我将集合的反序列化更改为不同的东西,以便代替普通的json表示,我可以从以下内容反序列化集合:
上面的示例将首先从列表中删除属性
foo
等于foobar
或从foo.
开始的值,然后添加elements
中指定的值。您可以根据需要实现自己的com.fasterxml.jackson.databind.deser.std.CollectionDeserializer
。然而,我发现在这种情况下使用Map而不是列表更容易,但我的示例中还没有这样的用例。在您的示例中,您可以使用name
属性作为Map键。