Я получаю следующее исключение при попытке десериализации с ObjectMapper на параметризованный класс (отлично работает для непараметризированных классов):
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.xyz.A (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.xyz.A is in unnamed module of loader 'app')
Вот исходный код:
Foo<A> request = OBJECT_MAPPER.readValue(payload, Foo.class);
Я пытался:
Foo<A> request = OBJECT_MAPPER.readValue(payload, new TypeReference<Foo<A>>() {});
А также:
JavaType myType = OBJECT_MAPPER.getTypeFactory()
.constructParametricType(Foo.class, A.class);
Foo<A> request = OBJECT_MAPPER.readValue(payload, myType);
Но я все еще получаю то же исключение.
Может ли быть что-то особенное в моем сценарииэто не рассматривается в этих вопросах?
Одна вещь, о которой я могу думать, это то, что мой Foo
на самом деле является @AutoMatter
-аннотированным интерфейсом, который генерируеткласс:
@AutoMatter
public interface Foo<T> {
Optional<T> parent;
Optional<List<T>> children;
}
Обычно у нас нет проблем с отображением классов, сгенерированных AutoMatter.Это просто добавление параметризации <T>
, которая, кажется, вызывает проблемы.
У кого-нибудь есть идея?
Изменить, чтобы ответить на вопросы @ MichalZiober:
В моем тестовом коде я на самом деле просто сериализую то, что, как я знаю, является действительным объектом, то есть , а затем десериализуем это, чтобы вернуть объект, с которого я начал:
Foo<A> myExampleObject;
ByteString.encodeUtf8(OBJECT_MAPPER.writeValueAsString(myExampleObject));
Редактировать 2
Хорошо, похоже, мы уже импортируем этот модуль:
@VisibleForTesting
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
.registerModule(new JodaModule())
.registerModule(new GuavaModule())
.registerModule(new AutoMatterModule())
.registerModule(new Jdk8Module())
.registerModule(new ProtobufModule())
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);