如何使用 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来反序列化。序列化是使用默认配置完成的。