如何使用 JSON-B 在没有 setter 的情况下解组/反序列化集合
How to unmarshal / deserialize collections without setters with JSON-B
我喜欢写我的 POJO 没有 setter 集合。
public class Parent {
private List<Child> children;
public List<Child> getChildren() {
if (children == null) {
children = new ArrayList<Child>();
}
return children;
}
}
// use case example
public class ParentDecorator {
private final Parent parent;
public ParentDecorator(Parent parent) {
this.parent = parent;
}
public void addAll(List<Child> children) {
parent.getChildren().addAll(children);
}
}
JSON-B 序列化工作正常,但反序列化不起作用,因为没有 setter 儿童。
问题:我该如何解决?
Adam Bien 写了一篇很好的文章 Private Fields Serialization with JSON-B and JAX-RS 2.1 / Java EE 8 我认为它可以修复它。这个想法是为私有字段实现自定义 PropertyVisibilityStrategy
。不幸的是,出于某种原因,它在我的情况下不起作用。
我对 Adam 的代码做了一个小改动,并将方法也更改为可见。现在我的 collections 被反序列化了。
/**
* JSON-B visibility strategy for deserialization.
*
* Enables JSON binding of private fields without a setter.
*/
public class JsonDeserializationStrategy implements PropertyVisibilityStrategy {
@Override
public boolean isVisible(Field field) {
return true;
}
@Override
public boolean isVisible(Method method) {
return true;
}
}
顾名思义,我只用这个PropertyVisibilityStrategy
来反序列化。序列化是使用默认配置完成的。
我喜欢写我的 POJO 没有 setter 集合。
public class Parent {
private List<Child> children;
public List<Child> getChildren() {
if (children == null) {
children = new ArrayList<Child>();
}
return children;
}
}
// use case example
public class ParentDecorator {
private final Parent parent;
public ParentDecorator(Parent parent) {
this.parent = parent;
}
public void addAll(List<Child> children) {
parent.getChildren().addAll(children);
}
}
JSON-B 序列化工作正常,但反序列化不起作用,因为没有 setter 儿童。
问题:我该如何解决?
Adam Bien 写了一篇很好的文章 Private Fields Serialization with JSON-B and JAX-RS 2.1 / Java EE 8 我认为它可以修复它。这个想法是为私有字段实现自定义 PropertyVisibilityStrategy
。不幸的是,出于某种原因,它在我的情况下不起作用。
我对 Adam 的代码做了一个小改动,并将方法也更改为可见。现在我的 collections 被反序列化了。
/**
* JSON-B visibility strategy for deserialization.
*
* Enables JSON binding of private fields without a setter.
*/
public class JsonDeserializationStrategy implements PropertyVisibilityStrategy {
@Override
public boolean isVisible(Field field) {
return true;
}
@Override
public boolean isVisible(Method method) {
return true;
}
}
顾名思义,我只用这个PropertyVisibilityStrategy
来反序列化。序列化是使用默认配置完成的。