Json возразит против проблемы десериализации в Graphql-spqr
Сбой преобразования объекта Json в GraphQLArgumetn в graphql-spqr.
попытался добавить GraphQLInterface(с истиной autodiscovery и scanpackage) к вышеупомянутым абстрактным классам и набрать тип GraphQL для всех конкретных классов.
Мой график запроса:
query contactsQuery($searchQuery : QueryInput) { contacts(searchQuery:$searchQuery){id}}
variables:{"searchQuery":{"bool":{"conditions":[{"must":{"matches":[{"singleFieldMatch":{"boost":null,"field":"firstname","value":"siddiq"}}],"bool":null}}]}})
Java-код:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@type(value = Must.class, name="must"),@type(value = MustNot.class, name="mustNot")})
public abstract class Condition
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@type(value = SingleFieldMatch.class, name="singleFieldMatch"),@type(value = MultiFieldMatch.class, name="multiFieldMatch")})
public abstract class Match
@GraphQLQuery(name = "contacts")
public List getContacts(@GraphQLArgument(name ="searchQuery") Query query)
Тем не менее он выдает ошибку неизвестного поля ошибки и т. Д. Не уверен, какая конфигурация отсутствует. Построение GraphQLSchema с AnnotatedResolvedBuilder, базовый пакет, настроенный JacksonValueMappperFactory и одноэлементные сервисы.
1 ответ
Привет, это может быть проблема, похожая на то, что у меня закончилось.
Изначально у меня было следующее
@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
искать существующую недвижимость.
Я ценю, что это не прямой ответ на ваш вопрос (и определенно это не симпатичный ответ), но, надеюсь, это поможет вам найти свое решение.