Десериализация JSON с использованием Джексона на сгенерированных классах из OpenDaylight - PullRequest
0 голосов
/ 04 мая 2019

Я использую проект OpendayLight md-sal для генерации Java-классов из Yang-модулей.

При переводе container-object OpenDaylight генерирует Java-интерфейс с методами getter для всех атрибутов и соответствующим классом Builder, который дополнительно имеет методы setter.

В моем проекте мне нужно сериализовать и десериализовать Java-объекты в \ из JSON. Для этого я использую Джексона. Проблема в том, чтобы десериализовать JSON-строку, я должен аннотировать сгенерированные интерфейсы с их соответствующими классами построителя.

Например:

  • У меня есть следующий контейнер в Ян:
container network {
    leaf name {
        type string;
    }
}
  • Чтобы сгенерировать из него Java, я добавил в свой pom.xml следующее:
<parent>
    <groupId>org.opendaylight.controller</groupId>
    <artifactId>mdsal-parent</artifactId>
    <version>1.8.1</version>
    <relativePath>../../parent</relativePath>
</parent>
<dependencies>
    <dependency>
        <groupId>org.opendaylight.mdsal.model</groupId>
        <artifactId>ietf-inet-types-2013-07-15</artifactId>
    </dependency>
    <dependency>
        <groupId>org.opendaylight.mdsal.model</groupId>
        <artifactId>ietf-interfaces</artifactId>
    </dependency>
<dependencies>
  • После вызова mvn install контейнер переводится (неважные вещи опущены):
public interface Network extends ChildOf<NetworkMod>, Augmentable<Network> {
    public static final QName QNAME = $YangModuleInfoImpl.qnameOf("network");

    @Nulluble
    String getName();
}

public class NetworkBuilder implements Builder<Network> {
    private String name;

    public NetworkBuilder() {}
    public NetworkBuilder(Network base) {
        // implementation
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Network build() {
        return new NetworkImpl(this);
    }

    private static final class NetworkImpl implements Network {
        private final String _name;

        NetworkImpl(NetworkBuilder base) {
            this._name = base.getName();
        }
    }
}
  • Для десериализации я добавляю следующие аннотации:
@JsonDeserialize(builder = NetworkBuilder.class)
public interface Network  extends ChildOf<NetworkMod>, Augmentable<Network> { /* code */ }

@JsonPOJOBuilder(withPrefix = "set")
public class NetworkBuilder implements Builder<Network> { /* code */ }

Поскольку мой проект большой, я бы предпочел иметь какое-то автоматизированное решение для добавления этих аннотаций. Есть ли способ сообщить OpenDaylight (с некоторыми дополнительными флагами) генерировать такие аннотации?

...