【问题标题】:Spring Boot Reactive MongoDB API with GraphQL - "Java class is not a List or generic type information was lost"Spring Boot Reactive MongoDB API with GraphQL - “Java 类不是列表或泛型类型信息丢失”
【发布时间】:2020-12-19 21:56:16
【问题描述】:

我浏览了很多文章和博客,以找到运行以下内容的正确方法。我已经实现了以下目标:

  • Spring Boot 应用程序 - 工作
  • 命令式 Spring Data MongoDB 连接到我的 Mongo Atlas 集群 - 有效
  • Spring GraphQL Starter 实现(解析器等) - 有效

现在我想实现我的最后一个要求。为了让 GraphQL 订阅正常工作,我需要集成 Spring Data MongoDB Reactive 依赖项并为订阅创建一个新的 GraphQL Resolver。这是我添加到已经运行的应用程序中的代码(希望代码片段能提供足够的信息来帮助我)。

Gradle.kt

implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")

MyApp.kt

@SpringBootApplication
@EnableReactiveMongoRepositories(basePackages = ["com.myapp"])
@EnableMongoRepositories(basePackages = ["com.myapp"])
class MyApp

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

SubscriptionResolver.kt

@Component
class SubscriptionResolver(
    private val characterReactiveRepository: CharacterReactiveRepository
) : GraphQLSubscriptionResolver {

    fun allCharacters(): Flux<Character> {
        return characterReactiveRepository.findAll()
    }
}

CharacterReactiveRepository.kt

interface CharacterReactiveRepository : ReactiveMongoRepository<Character, String>

character.graphqls

type Subscription {
   allCharacters: [Character]!
}

错误

SchemaClassScannerError: Unable to match type definition (NonNullType{type=ListType{type=TypeName{name='Character'}}}) with java type (reactor.core.publisher.Flux<com.backend.domain.Character>): Java class is not a List or generic type information was lost: reactor.core.publisher.Flux<com.backend.domain.Character>

详细异常

https://pastebin.com/sEWmDaTE

编辑 1

@Component
class SubscriptionResolver(
    private val characterReactiveRepository: CharacterReactiveRepository
) : GraphQLSubscriptionResolver {

    fun allCharacters(): Publisher<Character> {
        return characterReactiveRepository.findAll()
    }
}

【问题讨论】:

    标签: mongodb spring-boot kotlin graphql


    【解决方案1】:

    我的问题是我将订阅方法的返回值定义为[Character]!,意思是一个数组。但由于Flux&lt;Character&gt;Publisher&lt;Character&gt; 不是数组,而是该上下文中的单一类型,因此解析一直失败。

    将架构更改为以下有助于:

    type Subscription {
       allCharacters: Character
    }
    

    【讨论】:

      【解决方案2】:

      根据示例,您应该返回:

      @Component
      class SubscriptionResolver(
          private val characterReactiveRepository: CharacterReactiveRepository
      ) : GraphQLSubscriptionResolver {
      
          fun allCharacters(): Publisher<List<Character>> {
              return characterReactiveRepository.findAll()
          }
      }
      

      您可以在这里找到示例应用程序https://github.com/graphql-java-kickstart/samples/tree/master/spring-boot-webflux

      【讨论】:

      • 我添加了 Edit 1 但仍然出现相同的错误:(
      • 你试过用Publisher&lt;Character&gt; or Publisher>? Try to use Character`代替[Character]
      猜你喜欢
      • 2019-05-26
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多