0

Json 到 GraphQLArgumetn 对象转换在 graphql-spqr 中失败。

尝试将 GraphQLInterface(具有 autodiscovery true 和 scanpackage)添加到上述抽象类和 GraphQLtype 类型所有具体类。

我的图表查询:

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)

仍然抛出错误未知字段错误等。不确定缺少哪个配置。使用 AnnotatedResolvedBuilder 构建 GraphQLSchema,基础包配置 JacksonValueMappperFactory 和单例服务。

4

1 回答 1

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"})

为什么这样做(我认为):使用 Jackson 转换器(ObjectMapper)将我的代码中的 JSON 转换为对象时。我之前注意到 JSON 需要知道要转换为什么类。因此,最初使用@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")type属性写入 JSON 时将其写入字符串。

SPQR 可能会选择包含@JSON 标记,然后它似乎使用杰克逊转换器来尝试将您的查询转换为所需的对象。如果我是对的,这就是问题所在。由于查询不包含type无法正确转换的查询。此外,由于该type属性不是对象的成员变量,而是仅由 ObjectMapper 添加,因此 SPQR 没有拾取它,因此它不是对象架构的一部分。因此为了解决这个问题,我添加type了一个成员变量,它总是等于实际的类,然后改变我JsonTypeInfo的寻找现有的属性。

我很欣赏这不是对您的问题的直接答案(而且绝对不是一个漂亮的答案),但希望它能帮助您找到解决方案。

于 2019-07-04T07:52:13.150 回答