{"record":{"id":"a16e49d6c374d2f9","repo":"apache/seatunnel","slug":"config-validation-failed-a16e49","errorCode":"CONFIG_VALIDATION_FAILED","errorMessage":"tables_configs[%d]: invalid 'schema' configuration","messagePattern":"tables_configs\\[(.+?)\\]: invalid 'schema' configuration","errorType":"error_code","errorClass":"Neo4jConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-neo4j/src/main/java/org/apache/seatunnel/connectors/seatunnel/neo4j/source/Neo4jSourceFactory.java","lineNumber":133,"sourceCode":"\n        List<CatalogTable> catalogTables = new ArrayList<>(entries.size());\n        List<Neo4jSourceTableConfig> tableConfigs = new ArrayList<>(entries.size());\n        Set<String> tableIds = new HashSet<>();\n\n        for (int i = 0; i < entries.size(); i++) {\n            ReadonlyConfig tableConfig = ReadonlyConfig.fromMap(entries.get(i));\n            String query = tableConfig.getOptional(Neo4jSourceOptions.KEY_QUERY).orElse(null);\n            if (query == null || query.trim().isEmpty()) {\n                throw configError(\n                        String.format(\n                                \"tables_configs[%d]: 'query' must be configured and non-blank\", i));\n            }\n\n            CatalogTable catalogTable;\n            try {\n                catalogTable = CatalogTableUtil.buildWithConfig(tableConfig);\n            } catch (RuntimeException e) {\n                throw new Neo4jConnectorException(\n                        SeaTunnelAPIErrorCode.CONFIG_VALIDATION_FAILED,\n                        String.format(\"tables_configs[%d]: invalid 'schema' configuration\", i),\n                        e);\n            }\n\n            String tableId = catalogTable.getTableId().toTablePath().toString();\n            if (!tableIds.add(tableId)) {\n                throw configError(\n                        String.format(\n                                \"Duplicate schema.table '%s' found in tables_configs\", tableId));\n            }\n\n            catalogTables.add(catalogTable);\n            tableConfigs.add(\n                    new Neo4jSourceTableConfig(query, catalogTable.getSeaTunnelRowType(), tableId));\n        }\n\n        Neo4jSourceQueryInfo connectionInfo =","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-neo4j/src/main/java/org/apache/seatunnel/connectors/seatunnel/neo4j/source/Neo4jSourceFactory.java#L115-L151","documentation":"Neo4jSourceFactory.createNeo4jSource() builds each table's CatalogTable via CatalogTableUtil.buildWithConfig(tableConfig). If that parsing throws any RuntimeException (invalid schema fields, wrong types, malformed structure), it is rethrown as Neo4jConnectorException with CONFIG_VALIDATION_FAILED and a message pinpointing the failing index in tables_configs. It means the 'schema' block of that table config is not a valid SeaTunnel schema definition.","triggerScenarios":"tables_configs[i].schema containing unsupported field types, missing 'fields' map, wrong structure (e.g. fields as a list instead of a map), or values that CatalogTableUtil cannot parse.","commonSituations":"Hand-editing schema YAML/HOCON with syntax slips; using types unsupported by the catalog (typo'd type names like 'str' instead of 'string'); copying a schema from a different connector with a different format.","solutions":["Check the schema block for tables_configs[i]: ensure it uses `schema = { fields { name = string, ... } }` format with valid SeaTunnel data types","Validate the config with the SeaTunnel config checker before submitting","Copy a working schema example from Neo4j source docs and adapt field names/types","Look at the cause exception in the log for the exact parse failure"],"exampleFix":"// before\nschema { fields = [\"name\", \"age\"] }\n// after\nschema { fields { name = string age = int } }","handlingStrategy":"validation","validationCode":"// validate schema block before submit: fields must be a map of name -> SeaTunnel type\nboolean valid = schemaJson.has(\"fields\") && schemaJson.get(\"fields\").isObject();","typeGuard":null,"tryCatchPattern":"try { /* submit job */ } catch (Neo4jConnectorException e) { if (e.getMessage().contains(\"invalid 'schema' configuration\")) { fixSchemaConfig(); } throw e; }","preventionTips":["Use `schema = { fields { ... } }` map format with valid SeaTunnel types","Lint HOCON configs before submission","Test source with a minimal one-field schema first"],"tags":["java","neo4j","source","schema","config"],"backgroundTag":"schema-validation-failed","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}