Как демонтировать / десериализовать коллекции без сеттеров с помощью JSON-B - PullRequest
0 голосов
/ 13 марта 2019

Мне нравится писать свои POJO, чтобы не было сеттеров для коллекций.

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 работает нормально, но десериализация не работает, так как для детей нет установщика.

Вопрос: как мне это исправить?

1 Ответ

0 голосов
/ 13 марта 2019

Адам Бьен написал хорошую статью Сериализация частных полей с JSON-B и JAX-RS 2.1 / Java EE 8 , которая, как я думал, исправит это. Идея заключается в реализации пользовательского PropertyVisibilityStrategy для частных полей. К сожалению, по какой-то причине это не сработало в моей ситуации.

Я внес небольшое изменение в код Адама, а также изменил методы отображения. Теперь мои коллекции десериализованы.

/**
 * 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 только для десериализации, как следует из названия. Сериализация выполняется с настройками по умолчанию.

...