DGS 代码生成插件仅生成模式的类型

Posted

技术标签:

【中文标题】DGS 代码生成插件仅生成模式的类型【英文标题】:DGS Code Generation plugin generate only the types for the schema 【发布时间】:2021-11-26 08:48:07 【问题描述】:

我是 GraphQL 的新手。目前我正在尝试使用 Netflix 的 DGS 框架生成一个 GraphQL 客户端。我使用SWAPI 的模式作为我的域图服务的 GraphQL 模式文件。但是该工具只生成与类型相关的类和接口。但不要按预期生成查询 API。 这是我的 build.gradle 文件

plugins 
    id 'org.springframework.boot' version '2.5.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
    id("com.netflix.dgs.codegen") version "5.1.2"


group = 'com.clients.netflix'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories 
    mavenCentral()


dependencies 
    implementation 'org.springframework.boot:spring-boot-starter-web:2.5.5'
    developmentOnly 'org.springframework.boot:spring-boot-devtools:2.5.5'
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.5.5'
    implementation 'com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter:4.8.3'


test 
    useJUnitPlatform()


generateJava 
    generateClient = true
    generateDataTypes = true

是否有正确的方法可以做到这一点,还是框架中的问题?

【问题讨论】:

【参考方案1】:

这是正确的行为。正如您在文档中看到的,生成器会生成 exmaple API

DGS 代码生成插件会在项目构建过程中根据域图服务的 GraphQL 架构文件生成代码。该插件生成以下内容: 类型、输入类型、枚举和接口的数据类型。 包含类型和字段名称的 DgsConstants 类 数据提取器示例 代表您的查询的类型安全查询 API

DOC

生成器不知道您想如何从数据库中获取数据或什么。

如果要生成必须添加的示例

generateJava 
  ...
  includeQueries = ["hello"]
  includeMutations = [""]

【讨论】:

【参考方案2】:

偶然发现了同样的问题!

我认为查询/突变/订阅类型在 GQL 规范中的定义以及随后在 DGS 库中的处理方式存在细微差异:

private fun generateJavaClientApi(definitions: Collection<Definition<*>>): CodeGenResult 
    return if (config.generateClientApi) 
        definitions.asSequence()
            .filterIsInstance<ObjectTypeDefinition>()
            .filter  it.name == "Query" || it.name == "Mutation" || it.name == "Subscription" 
            .map  ClientApiGenerator(config, document).generate(it) 
            .fold(CodeGenResult())  t: CodeGenResult, u: CodeGenResult -> t.merge(u) 
     else CodeGenResult()

以及它们是如何在 swapi gql 架构中指定的:

schema 
  query: Root

哎呀!将对象类型定义重命名为 Query 可以解决问题。我认为这是 swapi 架构的错误...

【讨论】:

以上是关于DGS 代码生成插件仅生成模式的类型的主要内容,如果未能解决你的问题,请参考以下文章

QuickLook 生成器音频

自定义异步 HTTP 处理程序仅在 IIS 7.5 集成模式下生成错误 500 - 为啥?

自动生成函数的类型安全包装,然后仅使用 `__typename` 作为参数动态调用。打字稿

idea 使用 easyCode 插件快速生成代码,类似mybatis逆向生成代码

Builgen 插件——IntelliJ IDEA和Eclipse Java Bean Builder模式代码生成器-比lombok更符合需求

IDEA插件系列(106):Dummy Text Generator插件——快速生成一段文本