Json возразит против проблемы десериализации в Graphql-spqr - PullRequest
0 голосов
/ 27 июня 2019

Сбой преобразования объекта Json в GraphQLArgumetn в graphql-spqr.

попытался добавить GraphQLInterface (с истинным автообнаружением и scanpackage) к указанным выше абстрактным классам и типу GraphQL type для всех конкретных классов.

Мой запрос графа:

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 Ответ

0 голосов
/ 04 июля 2019

Привет, это может быть похоже на то, что у меня закончилось.

Изначально у меня было следующее

@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, чтобы искать существующее свойство.

Я ценю, что это не прямой ответ на ваш вопрос (и определенно не очень хороший ответ), но, надеюсь, это поможет вам найти решение.

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