如何在graphql-kotlin客户端中抑制GraphQLClientRequest请求体多余字段?
问题解决方法
原因说明
graphql-kotlin 客户端默认会将GraphQLClientRequest实现类的所有公开构造属性直接序列化到 GraphQL 请求根结构中,你定义的submissionUuid是公开构造参数,因此被额外插入到了请求体中。
解决方案
方案1:单字段忽略(最常用)
直接给不需要序列化的构造参数添加框架自带的@GraphQLIgnore注解即可,修改后的类定义如下:
class SubmissionQuery(@GraphQLIgnore val submissionUuid: String): GraphQLClientRequest<SubmissionQuery.Result> { ... }
该注解只会阻止字段被序列化到请求体,完全不影响你在类内部使用该参数构造查询语句或变量。
方案2:全局统一过滤(适合多额外参数场景)
如果你有大量请求类存在额外构造参数,可以通过自定义客户端序列化规则,全局只保留 GraphQL 规范要求的三个请求字段:
- 首先定义序列化混合类,指定仅保留允许的字段:
import com.fasterxml.jackson.annotation.JsonIncludeProperties @JsonIncludeProperties(value = ["query", "variables", "operationName"]) abstract class GraphQLClientRequestSerializationMixIn
- 初始化 GraphQL 客户端时,给 ObjectMapper 注册这个混合类:
import com.expediagroup.graphql.client.jackson.GraphQLClientObjectMapper import com.expediagroup.graphql.client.GraphQLClient val customObjectMapper = GraphQLClientObjectMapper() .addMixIn(GraphQLClientRequest::class.java, GraphQLClientRequestSerializationMixIn::class.java) // 使用自定义mapper初始化客户端 val graphQLClient = GraphQLClient(url = "你的GQL接口地址", mapper = customObjectMapper)
配置完成后所有请求类的额外属性都不会被序列化到请求根节点。
内容的提问来源于stack exchange,提问作者heringer
相关产品推荐
相关产品推荐

