{"record":{"id":"8bdda28fd10dc683","repo":"apache/seatunnel","slug":"s-d-s-must-be-configured-and-non-blank","errorCode":null,"errorMessage":"%s[%d]: '%s' must be configured and non-blank","messagePattern":"(.+?)\\[(.+?)\\]: '(.+?)' must be configured and non-blank","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":63,"sourceCode":"                + \"' and a '\"\n                + SCHEMA_KEY\n                + \"', and forbids a root-level '\"\n                + SCHEMA_KEY\n                + \"'\";\n    }\n\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":45,"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#L45-L77","documentation":"RabbitmqTableConfigsValidator.evaluate throws OptionValidationException when an entry inside tables-configs lacks a queue-name or it is blank. Each table entry must identify which RabbitMQ queue it consumes, identified by index in the message (tables-configs[i]).","triggerScenarios":"tables-configs[i] map has no queue-name key, or the value is null/whitespace-only after trim.","commonSituations":"Typo in key name (queue_name vs queue-name); empty string left from templating; entry copied from an example with a placeholder left blank.","solutions":["Add a non-blank queue-name to every entry in tables-configs","Trim/validate your config generation templates to not emit empty values","Ensure you use the exact option key queue-name as defined in RabbitmqBaseOptions"],"exampleFix":"// before\ntables-configs = [\n  { schema = { fields { id = int } } }\n]\n// after\ntables-configs = [\n  { queue-name = \"orders\", schema = { fields { id = int } } }\n]","handlingStrategy":"validation","validationCode":"for (int i = 0; i < entries.size(); i++) {\n  Object qn = entries.get(i).get(\"queue-name\");\n  if (qn == null || qn.toString().trim().isEmpty()) {\n    throw new IllegalArgumentException(\"tables-configs[\" + i + \"] missing non-blank queue-name\");\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  tablesConfigsValidator.evaluate(config, entries);\n} catch (OptionValidationException e) {\n  System.err.println(\"Entry error: \" + e.getMessage()); // includes tables-configs[i] index\n}","preventionTips":["Verify exact option key spelling (queue-name, hyphenated)","Template-generate configs and assert no blank placeholders remain","Check each entry independently with the validator before job submission"],"tags":["rabbitmq","config","validation","missing-field"],"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"}