Spring-GraphQL: источник иногда разрешается как объект, а иногда как LinkedHashMap.
исходный код:
type Query {
getAccounts: [Account]!
getAccountById(accountId: ID!): Account
}
type Customer {
id: ID!
email: String!
accounts: [Account]!
}
type Account {
id: ID!
balance: Float!
customer: Customer!
}
Контроллер:
@Controller
class AccountController {
@QueryMapping
fun getAccounts(): List<Account> = getAccounts()
@QueryMapping
fun getAccountById(@Argument accountId: String): Account? = getAccount(accountId)
@SchemaMapping(typeName = "Account", field = "customer")
fun getCustomerFromAccount(source: Account): Customer? = getCustomer(source.customerId)
}
data class Account(
val id: UUID,
val balance: BigDecimal,
val customerId: UUID
)
data class Customer(
val id: UUID,
val email: String
)
Заявление о проблеме
Когда я пытаюсь запросить
query {
getAccountById(accountId:"2e7a7e62-10fe-4d42-8806-889e7e7a1fa4"){
balance
customer {
email
}
}
}
это работает, потому что аргумент метода разрешается какAccount
тип.
Но если я попробую это,
query {
getAccounts{
balance
customer {
email
}
}
}
Это не работает какgetCustomerFromAccount
методsource
аргумент ожидается какLinkedHashMap
тип.
Что я делаю не так?
Трассировки стека:
java.lang.IllegalStateException: Parameter [0] in public org.dripto.banking.graphql.aggregator.Customer org.dripto.banking.graphql.aggregator.AccountController.getCustomerFromAccount(org.dripto.banking.graphql.aggregator.Account): does not match the source Object type 'class java.util.LinkedHashMap'.
at org.springframework.graphql.data.method.annotation.support.SourceMethodArgumentResolver.resolveArgument(SourceMethodArgumentResolver.java:75) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.data.method.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:83) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.getMethodArgumentValues(DataFetcherHandlerMethod.java:170) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.invoke(DataFetcherHandlerMethod.java:115) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.data.method.annotation.support.AnnotatedControllerConfigurer$SchemaMappingDataFetcher.get(AnnotatedControllerConfigurer.java:514) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.execution.ContextDataFetcherDecorator.lambda$get$0(ContextDataFetcherDecorator.java:74) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.execution.ReactorContextManager.invokeCallable(ReactorContextManager.java:104) ~[spring-graphql-1.0.1.jar:1.0.1]
at org.springframework.graphql.execution.ContextDataFetcherDecorator.get(ContextDataFetcherDecorator.java:73) ~[spring-graphql-1.0.1.jar:1.0.1]
at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:279) ~[graphql-java-18.2.jar:na]
at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:210) ~[graphql-java-18.2.jar:na]
at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:60) ~[graphql-java-18.2.jar:na]
at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:667) ~[graphql-java-18.2.jar:na]
Версии
Версия Kotlin: 1.7.10 Spring Boot: 2.7.2 JDK: 17 (темурин)