java 如何使用自定义类型字段的参数实现查询

cwtwac6a  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(225)

我想使用参数实现对自定义类型字段的分页。
使用如下示例模式:

type Book {
    title: String!
    year: Int!
}

type Author {
    name: String!
    books(page: Int, size: Int, sort: String): [Book!]!
}

type Query {
    allAuthors: [Author!]!
}

如何使用Spring GraphQL实现books(page: Int, size: Int, sort: String): [Book!]!的查询?我知道Query类型的查询是在@Controller注解类中使用@SchemaMapping注解方法实现的,但这似乎不适用于我的数据传输AuthorDto类。
应用程序在启动时或运行时不会抛出异常或警告,但使用查询时只会出现一个一般性错误,告诉我它没有实现。

{
  "errors": [
    {
      "message": "The field at path '/allAuthors[0]/books' was declared as a non null type, but the code involved in retrieving data has wrongly returned a null value.  The graphql specification requires that the parent field be set to null, or if that is non nullable that it bubble up null to its parent and so on. The non-nullable type is '[Book!]' within parent type 'Author'",
      "path": [
        "allAuthors",
        0,
        "books"
      ],
      "extensions": {
        "classification": "NullValueInNonNullableField"
      }
    }
  ],
  "data": null
}

我尝试在数据传输对象中使用@SchemaMapping,如下所示:

data class AuthorDto(
   private val author: Author // author is the actual Author model class
) {

   val name: Int
       get(): author.name

    @SchemaMapping(typeName = "Author", field = "books")
    fun getBooks(
        @Argument page: Int? = null,
        @Argument size: Int? = null,
        @Argument sort: String? = null,
    ): List<Book> {
        // my implementation for creating the list with pagination
    }
}

但是,Spring似乎没有选择实现,因为这个类在构造函数中使用了我的数据模型Author类(就像在示例https://github.com/spring-projects/spring-graphql/blob/1.0.x/samples/webmvc-http/src/main/java/io/spring/sample/graphql/project/Project.java中一样),所以我不能用@Controller来注解它,这样做对我来说也没有任何意义。
我正在使用Kotlin,但我希望能提供如何用Java实现这一点的解决方案。

r8xiu3jd

r8xiu3jd1#

要使用Spring for GraphQL实现查询allAuthors,您应该在带@Controller注解的类中包含以下方法:

@Controller
public class MyGraphqlController {
    @QueryMapping
    List<AuthorDto> allAuthors(){
        // implementation for creating the list with pagination
    }
}

注意几件事:

  1. AuthorDto类(数据类、Java记录等)应该具有与schema.graphqls中定义的字段相同的字段,但目前情况似乎并非如此。
    1.在您的schema.graphqls定义中,我看到Author有一个Book数组,这是可以的,但是这个字段有参数
books(page: Int, size: Int, sort: String): [Book!]!

我不确定GraphQL(type Book{...})中的自定义类型定义是否允许这样做,因为它不是查询、变异或订阅。
希望有用,干杯。

相关问题