Привет, это может быть похоже на то, что у меня закончилось.
Изначально у меня было следующее
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@GraphQLInterface(name = "AbstractClass", implementationAutoDiscovery = true)
public abstract class AbstractClass{
со следующим запросом
addNewObject(object: {name: "soft2", id: "asdas"})
Чтобы преобразование заработало, мне нужно было сделать следующее изменение
@JsonTypeInfo(use = Id.NAME, include = As.EXISTING_PROPERTY, property = "type")
@GraphQLInterface(name = "AbstractClass", implementationAutoDiscovery = true)
public abstract class AbstractClass{
private String type = this.getClass().getSimpleName();
/**
* @return the type
*/
@GraphQLQuery(name = "type", description = "The concrete type of the node. This should match the initialised class. E.g. \"Concrete\", \"DecafCoffee\"")
public String getType() {
return type;
}
с запросом сейчас
addNewConcreteObject(concrete: {name: "soft2", id: "asdas", type: "Concrete"})
Почему это сработало (я думаю):
При преобразовании из JSON в объекты в моем коде используется конвертер Джексона (ObjectMapper). Ранее я заметил, что JSON требует знания того, в какой класс конвертировать. Таким образом, первоначальное использование @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
поместило свойство type
в JSON, когда оно было записано в строку.
SPQR может обнаружить включение тега @JSON, и тогда он, похоже, использует конвертер Джексона, чтобы попытаться преобразовать ваш запрос в требуемый объект.
Если я прав, вот в чем проблема.
Поскольку запрос не содержит type
, запрос не может быть правильно преобразован. Более того, так как свойство type
не было переменной-членом объекта, а было добавлено только ObjectMapper, SPQR не подняло его, и поэтому оно не было частью схемы для объекта. Таким образом, чтобы обойти это, я добавил type
в качестве переменной-члена, которая всегда равна фактическому классу, затем изменил мой JsonTypeInfo
, чтобы искать существующее свойство.
Я ценю, что это не прямой ответ на ваш вопрос (и определенно не очень хороший ответ), но, надеюсь, это поможет вам найти решение.