Этот вопрос является копией другого вопроса, который я опубликовал, поскольку я ищу ясности в том, как сериализация / проверка работает в отношении JsonSubTypes
Другой вопрос: InvalidSchemaException с использованием JsonSubTypes, не собирая то, что я определил в базовом интерфейсе
Допустим, у меня есть базовый класс А
A орудует BaseInterface
Если у меня есть подкласс B, который расширяет А, но реализует свои собственные интерфейсы, такие как AlpahInterface, BetaInterface, CharlieInterface. В этом заключается проблема, поскольку проверка не выполняется, потому что AlphaInterface перечисляет только, например, LAMA и поэтому валидация не знает обо всех других типах, определенных в базовом BaseInterface.
Подкласс B реализует только то, что определено AlphaInterface, игнорируя тот факт, что он расширяет BaseInterface, а также игнорирует другие реализованные интерфейсы и явно не обращает внимания на тот факт, что B расширяет A, который реализует BaseInterface. Я мог проверить это, потому что я добавил в AlphaInterface все подтипы, определенные в базовом интерфейсе, и все работает, но я не хочу, чтобы в каждом интерфейсе каждый возможный подтип определялся, поскольку не все они относятся к классу, который их реализует. .
Я бы подумал, что будет выбрана либо расширенная реализация A, либо все реализованные интерфейсы B, а не только первый в листинге.
Пожалуйста, объясните, потому что все чтение, которое я сделал за последние два дня в Интернете, не прояснило для меня это. Если кто-то захочет открыть дискуссионный чат, это тоже будет здорово!
Спасибо.
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = CatTopic.class, name = "CAT"),
@Type(value = DogTopic.class, name = "DOG"),
@Type(value = FishTopic.class, name = "FISH"),
@Type(value = LamaTopic.class, name = "LAMA")
})
public interface BaseInterface {}
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = LamaTopic.class, name = "LAMA")
})
public interface AlpahInterface extends BaseInterface {}
// Something to extend A
public class B extends A implements AlpahInterface, BetaInterface, CharlieInterface {}
С MINIMAL_CLASS новые элементы, которые я создал, работают, но сломали старые. Все еще пытаюсь понять это. Нас трое работают над этой проблемой, и единственное, с чем мы можем согласиться, это то, что тот, кто реализовал этот наш код, сделал это так, как мы не можем найти ни в одном примере в Интернете. Мы в тупике. Мы не собираемся менять кодовую базу, так как у нас есть совершенно новая версия кода, и она должна быть прекращена, и для этого потребуется перекодирование более 300 файлов, и кто знает, какое еще влияние это может иметь. фу




Я не понимаю, где этот код должен читаться в основном листинге JsonSubTypes, но мне удалось решить мою связанную проблему с публикацией. Наконец-то нашел способ решить основную проблему в своем посте по теме. общедоступная аннотация @interface JsonTypeInfo
Что необходимо сделать, так это для каждого из классов, определенных в JsonSubTypes, вы также должны указать для этого класса @JsonTypeName ("ClassName") например
@JsonTypeName("CAT")
public class CatTopic extends A implements AlpahInterface, BetaInterface, CharlieInterface {}
Играя с моим кодом для AlphaInterface, если я изменю JsonTypeInfo.Id.NAME на JsonTypeInfo.Id.MINIMAL_CLASS, он сможет проверить. Может ли кто-нибудь указать мне на какую-нибудь хорошую документацию о понимании того, что происходит с этим материалом Джексона? Я нахожу примеры, но это основано на предположении, что вы уже это понимаете, тогда как я хочу прочитать подробности функциональности. Спасибо