Spring Boot中基于@GraphQlRepository的GraphQL Mutation实现方法
Spring GraphQL Mutation 实现说明
核心结论
@GraphQlRepository 仅支持自动生成查询类型的GraphQL API(比如你用到的customers、customerById),Mutation(增删改操作)没有类似的自动实现方案,必须通过带有@MutationMapping的控制器手动编写。
具体原因与实现示例
@GraphQlRepository是Spring Data与Spring GraphQL的整合注解,它会基于你定义的Reactive Repository接口中的查询方法(如findAll()、findById())自动映射为GraphQL查询字段,但该机制仅针对查询场景设计,不覆盖增删改操作。- 对于Mutation,你需要在控制器中手动编写方法,通过
@MutationMapping标记,并调用ReactiveMongoRepository的对应方法完成操作。以下是Kotlin的示例代码:
import org.springframework.graphql.data.method.annotation.Argument import org.springframework.graphql.data.method.annotation.MutationMapping import org.springframework.stereotype.Controller import reactor.core.publisher.Mono @Controller class CustomerMutationController(private val customerRepository: CustomerRepository) { // 创建客户 @MutationMapping fun createCustomer(@Argument input: CustomerInput): Mono<Customer> { val customer = Customer(id = null, name = input.name, email = input.email) return customerRepository.save(customer) } // 更新客户 @MutationMapping fun updateCustomer(@Argument id: String, @Argument input: CustomerInput): Mono<Customer> { return customerRepository.findById(id) .map { existing -> existing.copy(name = input.name, email = input.email) } .flatMap(customerRepository::save) } // 删除客户 @MutationMapping fun deleteCustomer(@Argument id: String): Mono<Boolean> { return customerRepository.deleteById(id) .then(Mono.just(true)) .onErrorReturn(false) } } // 定义输入类型 data class CustomerInput(val name: String, val email: String)
额外说明
框架不自动生成Mutation的原因在于,增删改操作通常涉及业务校验、权限控制、事务处理等定制化逻辑,自动生成的通用实现无法满足实际业务需求,因此将这块逻辑的控制权完全交给开发者。
内容的提问来源于stack exchange,提问作者Martin Niederl
相关产品推荐
相关产品推荐

