graphql dgs springboot gradle学习

简介: https://dgraphql dgs springboot gradle学习
1.gradle相关信息

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  id("org.springframework.boot") version "2.5.6"
  id("io.spring.dependency-management") version "1.0.11.RELEASE"
  kotlin("jvm") version "1.6.21"
  kotlin("plugin.spring") version "1.6.21"
  id("com.netflix.dgs.codegen") version "5.1.16"
}

group = "com.ityu"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

configurations {
  compileOnly {
    extendsFrom(configurations.annotationProcessor.get())
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
  implementation("org.jetbrains.kotlin:kotlin-reflect")
  implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")


  implementation(platform("com.netflix.graphql.dgs:graphql-dgs-platform-dependencies:latest.release"))
  implementation ("com.netflix.graphql.dgs:graphql-dgs-spring-boot-starter")
  implementation("com.netflix.graphql.dgs:graphql-dgs-extended-scalars")
  implementation("com.github.javafaker:javafaker:1.+")

  implementation ("org.springframework.boot:spring-boot-starter-test")
  developmentOnly("org.springframework.boot:spring-boot-devtools")
  annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
  testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
  kotlinOptions {
    freeCompilerArgs = listOf("-Xjsr305=strict")
    jvmTarget = "11"
  }
}
//
tasks.withType<com.netflix.graphql.dgs.codegen.gradle.GenerateJavaTask> {
  generateClient = true
  packageName = "com.ityu.demo.generated"
}

tasks.withType<Test> {
  useJUnitPlatform()
}

2. 添加resources/schema/schema.graphql
type Query {
    #方法返回数组
    events:[Event!]!
}

type Mutation {
   createEvent(eventInput:EventInput!):Event!
}

input EventInput{
    title:String!
    description:String!
    price:String!
    data:String!
}


type Event{
    id:ID!
    title:String!
    description:String!
    price:String!
    data:String!
}
3. java代码
@DgsComponent
class EventDataFetcher {

    private val events = mutableListOf<Event>()

    @DgsQuery
    fun events(): MutableList<Event> {
        return events
    }

    @DgsMutation
    fun createEvent(@InputArgument eventInput: EventInput): Event {
        val event = Event(
            UUID.randomUUID().toString(),
            eventInput.title,
            eventInput.description,
            eventInput.price,
            eventInput.data
        )
        events.add(event)
        return event

    }
}
4.打开浏览器工具

graphiql

graphql

mutation{
  createEvent(eventInput:{
     title:"title2",
    description:"description 2",
    price:"50.99",
    data:"2222",
  }){
    id
    description
    price
    data
  }
}

# 添加对象
query{
  events{
    id
    title
  }
}


5. OKhttp调用
   fun testGraphql() {
  //query
  val apply = getObjectNode().apply {
        put(
            "query", """query{
  uses{
    id
  }
}"""
        )
    }
    
    //mutation
    val apply2 = getObjectNode().apply {
        put(
            "query", """mutation{
  createUser(userInput:{
    email:"test@test4",
    password:"testest3"
  }){
    id
    password
  }
}"""
        )
    }

    //带参数
    val apply3 = getObjectNode().apply {
        put(
            "query", """mutation cU(${'$'}email:String!,${'$'}password:String!){
  createUser(userInput:{
    email:${'$'}email,
    password:${'$'}password
  }){
    id
    password
  }
}""").put("variables", getObjectNode().put("email","3@3.com").put("password","99999"))
    }

    val toRequestBody = apply3.toString().toRequestBody("application/json; charset=utf-8".toMediaType())
    val post = Request.Builder().url("http://localhost:8081/graphql").post(toRequestBody).build()
    val client = getOkHttpClient().newCall(post).execute()
    //0x0000000000000000000000000000000000000000
    println(client.body?.string() ?: "====")
}

6. doctor compose up

需要在有docker-compose.yml文件的文件夹下执行该命令

7. DgsCustomContextBuilderWithRequest

DgsContext.getCustomContext(DgsDataFetchingEnvironment)

@Component
@Slf4j
class AuthContextBuilder(var userDataFetcher:UserDataFetcher) : DgsCustomContextBuilderWithRequest<AuthContext?> {

    override fun build(extensions: Map<String, Any>?, headers: HttpHeaders?, webRequest: WebRequest?): AuthContext? {
        headers?.let {
            log.warn("AuthContextBuilder${it.getFirst("a_h")}")
            return AuthContext(userDataFetcher.uses().find {
                it.id=="1"
            },false)
        }
        return null
    }
}

8. Resolver 使用

parentType 那个TYPE field 那个属性

对Event的两个属性赋值


    //schema.graphql中定义
   type Event{
    user:User!
  events:[Event!]
   }

    @DgsData(parentType = "Event", field="user")
    fun creator(dfe:DgsDataFetchingEnvironment): User? {
        val event = dfe.getSource<Event>()
        val id =  event.creatorId
        return usersData.find {
            it.id == id.toString()
        }

    }
    
    
     @DgsData(parentType = "User", field = "events")
     fun events(dfe: DgsDataFetchingEnvironment): MutableList<Event>? {
        val user = dfe.getSource<User>()
        val events = eventsData.filter {
            it.creatorId.toString() == user.id
        }
        return events.toMutableList()
    }

9. 查询相关

参数human(id:“1000”)

height(unit:FOOT) 设置返回值类型为float

别名写法 别名:原名 a:hero b:hero

定义fragment xxx on yyy 就是在yyy上面选择一些字段 使用…xxx

query name{} 定义一个名字

… on yyy{}

implements interface

__typename

query variables

request headers

使用变量 query name($filedName:filedType){xxx(fileName:$filedName)}

   mutation cU($email:String!,$password:String!){
      createUser(userInput:{
        email:$email,
        password:$password
      }){
        id
        password
      }
}
     
  {
     "email": "testemail2",
     "password": "fdsafdasf"
}
 //   fragment
fragment  A on Booking{
    id
    event{
        id
    }
}

//interface implements
interface  B {
    id: ID!
    event: Event!
}

type Bb implements B{
    id: ID!
    event: Event!
}
     
     

10. DataLoder
//创建DataLoader
@DgsDataLoader(name = "creators")
class CreatorsDataLoader:BatchLoader<Int, User> {
    override fun load(userIds: MutableList<Int>): CompletionStage<MutableList<User>> {
       return  CompletableFuture.supplyAsync{
           return@supplyAsync usersData.filter {
               userIds.contains(it.id.toInt())
           }.toMutableList()
       }
    }

}

    //使用 该方法还是会调用多次,只不过不会从数据库取数据
    //组合成一起批量获取
    @DgsData(parentType = "Event", field="user")
    fun creator(dfe:DgsDataFetchingEnvironment): CompletableFuture<User> {
        val event = dfe.getSource<Event>()
        val id =  event.creatorId
        val dataLoader = dfe.getDataLoader<Int,User>(CreatorsDataLoader::class.java)
        return  dataLoader.load(id)

    }

11. 代码

gitee

相关文章
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
63 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
41 9
|
1月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
32 0
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
27 1
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
100 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
194 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
34 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
36 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
2月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
212 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
77 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
下一篇
DataWorks