我想使用参数实现对自定义类型字段的分页。
使用如下示例模式:
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实现这一点的解决方案。
1条答案
按热度按时间r8xiu3jd1#
要使用Spring for GraphQL实现查询
allAuthors
,您应该在带@Controller
注解的类中包含以下方法:注意几件事:
AuthorDto
类(数据类、Java记录等)应该具有与schema.graphqls
中定义的字段相同的字段,但目前情况似乎并非如此。1.在您的
schema.graphqls
定义中,我看到Author
有一个Book
数组,这是可以的,但是这个字段有参数我不确定GraphQL(
type Book{...}
)中的自定义类型定义是否允许这样做,因为它不是查询、变异或订阅。希望有用,干杯。