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

Мне нравится писать свои 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 ответ

Решение

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

Другие вопросы по тегам