GraphQLError(Variable 'a' has coerced Null value for NonNull type)

9069 단어 GraphQLKotlintech
graphiql-java에서GraphQLError(message=Variable 'variable' has coerced Null value for NonNull type)가 나타났을 때 대체적으로 다음과 같은 두 가지 모델이 있었다.
  • 조회측의 매개 변수의 성명은 비어 있음
  • 해당 매개 변수가 전달되지 않음
  • 질의 측면의 매개변수 선언이 비어 있음


    Skima 선언에서 파라미터가 non-nullUserInput!인 경우
    extend type Mutation {
      createUser(input: UserInput!) : User!
    }
    input UserInput {
      name: string
    }
    
    아래 UserInput를 조회할 때 오류가 발생했습니다.
    mutation CreateUser($input: UserInput) { // <- nullableで宣言してしまっている。
        createUser(input: $input) {
            id
        }
    }
    
    UserInput!에서 선언하면 OK.

    해당 매개 변수가 전달되지 않았습니다.


    Spring-Boot에서 GraphiQl에 대한 요청은 다음과 같습니다.
    import kotlinx.coroutines.withContext
    import org.springframework.http.HttpEntity
    import org.springframework.http.HttpMethod
    import org.springframework.web.client.RestOperations
    import org.springframework.web.client.exchange
    import kotlin.coroutines.coroutineContext
    
    data class GraphQlQuery(val query: String, val variables: Map<String, Any>?)
    
    suspend fun post(url: String, restOperations: RestOperations, query: GraphQlQuery): String {
        return withContext(coroutineContext) {
            val response = restOperations
                .exchange<String>(url, HttpMethod.POST, HttpEntity(query))
            requireNotNull(response.body)
        }
    }
    
    이때 나도 모르게 다음과 같은 내용을 썼다.
    post("https://...", restOperations, 
      GraphQlQuery("""
        mutation CreateUser($input: UserInput!) {
        createUser(input: $input) {
            id
        }
      }
      """,
      mapOf("name" to "mike") // おや?
    )
    
    매개 변수인 UserInput의 유형은 다음과 같기 때문에 비교적 적합할 수 있습니다...
    input UserInput {
      name: string
    }
    
    실제로 키="input"에 value =UserInput을 입력해야 합니다.
    data class UserInput(val name: String)
    post("https://...", restOperations, 
      GraphQlQuery("""
        mutation CreateUser($input: UserInput!) {
        createUser(input: $input) {
            id
        }
      }
      """,
      mapOf("input" to UserInput("mike")) // Yes!
    )
    
    그렇게 어리석게 굴지 마...그렇게 생각할 수도 있지만 실제로 빠져서 시간이 많이 갔어요.

    좋은 웹페이지 즐겨찾기