Джексон сериализация абстрактного интерфейса - PullRequest
0 голосов
/ 16 января 2019

Я работаю со структурой, которая выполняет сериализацию Java Jackson класса Config с полем supplier, которое является абстрактным интерфейсом Supplier<T>. Приведенные ниже интерфейсы определены в платформе, поэтому я не могу изменить / добавить аннотации.

public interface Supplier<T> {
    T get();
}

public interface Calculator {
}

@Data
@NoArgsConstructor
public class Config extends Serializable {
  private Supplier<Calculator> supplier;
}

У меня есть конкретная реализация Supplier:

class MySupplier implements Supplier {
   @Override Calculator get() { return ...; }
}

Когда я сериализирую экземпляр Config в JSON, поле поставщика сериализуется без информации о классе. Из того, что я понимаю, это потому, что объявление поля является абстрактным. В результате во время десериализации Джексон не знает, как создать экземпляр поля supplier.

"config" : {
 ...
 "supplier" : { }
 ...
}

Как я могу заставить мою реализацию интерфейса Supplier добавить информацию об имени класса в сгенерированный JSON, чтобы обеспечить надлежащую десериализацию? У меня нет доступа к коду, который выполняет сериализацию и десериализацию, я могу манипулировать только моей реализацией Supplier.

1 Ответ

0 голосов
/ 17 января 2019

Jackson позволяет настроить сторонние классы, используя функцию под названием MixIn. Для получения дополнительной информации читайте:

  1. Джексон Миксин на помощь
  2. Смешанные аннотации Джексона

Вам необходимо указать два новых интерфейса, которые позволят вам добавлять аннотации для других классов:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({@JsonSubTypes.Type(value = MySupplier.class, name = "MySupplier")})
interface SupplierAnnotations {
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({
        @JsonSubTypes.Type(value = MyCalculator.class, name = "MyCalculator"),
        @JsonSubTypes.Type(value = HisCalculator.class, name = "HisCalculator") }
)
interface CalculatorAnnotations {
}

Теперь вы должны сообщить ObjectMapper о ваших новых классах. Вы можете сделать это следующим образом:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Calculator.class, CalculatorAnnotations.class);
mapper.addMixIn(Supplier.class, SupplierAnnotations.class);

Все, что вам нужно сделать, это перечислить подтипы для интерфейсов Suplier и Calculator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...