【问题标题】:Json to object deserialization issue in Graphql-spqrJson 到 Graphql-spqr 中的对象反序列化问题
【发布时间】:2019-11-09 20:06:25
【问题描述】:

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

尝试将 GraphQLInterface(具有自动发现和扫描包)添加到上述抽象类 和 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 和单例服务。

【问题讨论】:

    标签: java json graphql-spqr


    【解决方案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 中。

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多