kotlin 使用@GraphQlRepository在Sping Boot 中实现GraphQL变异

2fjabf4q  于 2022-12-30  发布在  Kotlin
关注(0)|答案(1)|浏览(196)

我有以下Sping Boot React式“堆栈”,其中包含GraphQL和MongoDB(在Kotlin中):

一个非常基本的服务器示例,它向查询客户公开GraphQL API:

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.repository.ReactiveMongoRepository
import org.springframework.graphql.data.GraphQlRepository

@SpringBootApplication class ServerApplication

fun main(args: Array<String>) {
    runApplication<ServerApplication>(*args)
}

@Document
data class Customer(
    @Id val id: String? = null,
    val name: String?,
)

@GraphQlRepository 
interface CustomerRepository : ReactiveMongoRepository<Customer, String>

与以下GraphQL模式文件结合使用

type Customer {
    id: ID
    name: String
}

type Query {
    customers: [Customer]
    customerById(id: ID!): Customer
}

type Mutation {
    createCustomer(name: String!): Customer
}

已经可以查询customers/customerById并相应地使用例如以下代码检索数据:

{
  customers { id name }
  customerById(id: "...") { name }
}

@GraphQlRepository注解可以实现这一点,它自动注册一个处理程序,以便直接从数据库获取数据。
然而,我在documentation中找不到任何关于如何实现变异的信息,也就是说,是否有这样一个简单的自动解决方案,比如查询,或者是否必须由@MutationMapping的控制器**手动实现。

@Controller
class CustomerController(val customerRepository: CustomerRepository) {
    @MutationMapping
    fun createCustomer(@Argument name: String?): Mono<Customer> {
        return customerRepository.save(Customer(name = name))
    }
}
yhxst69z

yhxst69z1#

就我所知,必须像您建议的那样,通过Controller中专用的、带@MutationMapping注解的方法来实现突变。我已经做了一些练习,与您的示例的唯一区别是我使用了一个特殊的Input类型-在schema和Java代码库中-来定义它;对于您来说,String就可以了。
方案:

type Query{
    obras: [Obra]
    obrasPorArtista(apellidoArtista:String!): [Obra]
}

type Mutation{
    addObra(nueva: ObraInput): Obra
}

type Obra{
    id: ID
    titulo: String
    precio: Float
}

input ObraInput{
    titulo: String
    artista: String
    precio: Float
}

控制器(注入服务):

@MutationMapping
public Mono<Obra> addObra(@Argument ObraInput nueva){
    return obraService.guardarObra(nueva);
}

对象输入:

public record ObraInput(String titulo, String artista, double precio) {}

(The Obra是带有JPA注解、列等的Entity
希望能有所帮助!

相关问题