{"record":{"id":"1b5b7c85cc177488","repo":"apache/seatunnel","slug":"graphql-source-parameter-error","errorCode":"GRAPHQL_SOURCE_PARAMETER_ERROR","errorMessage":"GraphQL Sink query is required.","messagePattern":"GraphQL Sink query is required\\.","errorType":"error_code","errorClass":"GraphQLConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-graphql/src/main/java/org/apache/seatunnel/connectors/seatunnel/graphql/util/GraphQLUtil.java","lineNumber":83,"sourceCode":"    private static void checkWebSocketProtocol(String url) {\n        checkProtocol(\n                url,\n                \"ws://\",\n                \"wss://\",\n                \"For subscription mode, URL must start with ws:// or wss://\");\n    }\n\n    public static OperationDefinition.Operation parseOperationType(String query) {\n        Document document = new Parser().parseDocument(query);\n        return document.getDefinitionsOfType(OperationDefinition.class).stream()\n                .findFirst()\n                .map(OperationDefinition::getOperation)\n                .orElse(null);\n    }\n\n    public static void validateSinkOperation(String query) {\n        if (query == null || query.isEmpty()) {\n            throw new GraphQLConnectorException(\n                    GraphQLConnectorErrorCode.GRAPHQL_SOURCE_PARAMETER_ERROR,\n                    \"GraphQL Sink query is required.\");\n        }\n        OperationDefinition.Operation operationType = parseOperationType(query);\n        switch (operationType) {\n            case MUTATION:\n                break;\n            case SUBSCRIPTION:\n            case QUERY:\n            default:\n                throw new GraphQLConnectorException(\n                        GraphQLConnectorErrorCode.GRAPHQL_SINK_PARAMETER_ERROR,\n                        \"GraphQL Sink unsupported operation type: \" + operationType);\n        }\n    }\n\n    public static void validateSourceOperation(String query, Boolean enableSubscription) {\n        if (query == null) {","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-graphql/src/main/java/org/apache/seatunnel/connectors/seatunnel/graphql/util/GraphQLUtil.java#L65-L101","documentation":"validateSinkOperation requires a non-empty GraphQL query string for the sink; if null or empty it throws GRAPHQL_SOURCE_PARAMETER_ERROR with \"GraphQL Sink query is required.\". The sink needs an explicit mutation document to execute per batch.","triggerScenarios":"GraphQL sink created with the query/operation option missing or set to an empty string; validateSinkOperation called during sink initialization.","commonSituations":"Forgot the query option in sink config; config key typo so the option falls back to null; template rendering produced an empty string.","solutions":["Add the query option with a mutation document to the sink config","Check for typos in the config key","Ensure the value is not an empty string","Confirm the document parses and is a MUTATION (next validation step)"],"exampleFix":"// before\nGraphQLSink {\n  url = \"https://api.example.com/graphql\"\n}\n// after\nGraphQLSink {\n  url = \"https://api.example.com/graphql\"\n  query = \"mutation ($name: String!) { createUser(name: $name) { id } }\"\n}","handlingStrategy":"validation","validationCode":"if (query == null || query.isEmpty()) throw new IllegalArgumentException(\"GraphQL sink query required\");  // pre-check before submit","typeGuard":"boolean hasSinkQuery = cfg.getOptional(\"query\").map(q -> !q.isEmpty()).orElse(false);","tryCatchPattern":"try { GraphQLUtil.validateSinkOperation(query); } catch (GraphQLConnectorException e) { /* surface which option is missing */ }","preventionTips":["Always set query in GraphQL sink config","Keep a config template with a sample mutation","Validate configs with a pre-submit checklist"],"tags":["graphql","config","validation","sink"],"backgroundTag":"missing-required-config-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}