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