{"record":{"id":"79fe7e7239c73065","repo":"apache/seatunnel","slug":"s-d-s-must-be-configured","errorCode":null,"errorMessage":"%s[%d]: '%s' must be configured","messagePattern":"(.+?)\\[(.+?)\\]: '(.+?)' must be configured","errorType":"validation","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-rabbitmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rabbitmq/config/RabbitmqTableConfigsValidator.java","lineNumber":69,"sourceCode":"\n    @Override\n    public boolean evaluate(ReadonlyConfig config, List<Map<String, Object>> entries)\n            throws OptionValidationException {\n        if (config.getOptional(RabbitmqBaseOptions.SCHEMA).isPresent()) {\n            throw new OptionValidationException(\n                    \"Cannot specify both '%s' and root-level '%s'.\", TABLE_CONFIGS_KEY, SCHEMA_KEY);\n        }\n        for (int i = 0; i < entries.size(); i++) {\n            ReadonlyConfig entry = ReadonlyConfig.fromMap(entries.get(i));\n            String queueName = entry.getOptional(RabbitmqBaseOptions.QUEUE_NAME).orElse(null);\n            if (queueName == null || queueName.trim().isEmpty()) {\n                throw new OptionValidationException(\n                        \"%s[%d]: '%s' must be configured and non-blank\",\n                        TABLE_CONFIGS_KEY, i, QUEUE_NAME_KEY);\n            }\n\n            if (!entry.getOptional(RabbitmqBaseOptions.SCHEMA).isPresent()) {\n                throw new OptionValidationException(\n                        \"%s[%d]: '%s' must be configured\", TABLE_CONFIGS_KEY, i, SCHEMA_KEY);\n            }\n        }\n\n        return true;\n    }\n}\n","sourceCodeStart":51,"sourceCodeEnd":77,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-rabbitmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rabbitmq/config/RabbitmqTableConfigsValidator.java#L51-L77","documentation":"RabbitmqTableConfigsValidator.evaluate throws OptionValidationException when an entry in tables-configs has a queue-name but no schema. Every per-table entry must declare its own schema so the reader can deserialize that queue's messages.","triggerScenarios":"tables-configs[i] contains queue-name (validated non-blank) but the schema key is missing from that entry.","commonSituations":"User assumed root schema covers all entries; entry added programmatically without schema; doc example truncated.","solutions":["Add a schema block to each tables-configs entry","Verify with the connector docs which schema format is expected inside tables-configs","If all queues share one schema, you still must declare it per entry when using tables-configs (root schema is rejected)"],"exampleFix":"// before\ntables-configs = [\n  { queue-name = \"orders\" }\n]\n// after\ntables-configs = [\n  { queue-name = \"orders\", schema = { fields { id = int, name = string } } }\n]","handlingStrategy":"validation","validationCode":"for (int i = 0; i < entries.size(); i++) {\n  if (!entries.get(i).containsKey(\"schema\")) {\n    throw new IllegalArgumentException(\"tables-configs[\" + i + \"] missing schema\");\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  tablesConfigsValidator.evaluate(config, entries);\n} catch (OptionValidationException e) {\n  System.err.println(\"Entry error: \" + e.getMessage());\n}","preventionTips":["Include a schema in every tables-configs entry — root schema does not apply","Copy entries from a known-good template that contains schema","Run RabbitmqTableConfigsValidator locally before submitting"],"tags":["rabbitmq","config","validation","schema"],"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"}