{"record":{"id":"29d9c065571ee751","repo":"apache/seatunnel","slug":"tables-configs-d-topics-must-not-be-empty","errorCode":null,"errorMessage":"tables_configs[%d]: 'topics' must not be empty","messagePattern":"tables_configs\\[(.+?)\\]: 'topics' must not be empty","errorType":"error_code","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceFactory.java","lineNumber":132,"sourceCode":"\n        @Override\n        public String description() {\n            return \"each tables_configs entry must have valid topics, \"\n                    + \"start.mode.timestamp (>= 0) when CONSUME_FROM_TIMESTAMP, \"\n                    + \"and non-empty start.mode.offsets when CONSUME_FROM_SPECIFIC_OFFSETS\";\n        }\n\n        @Override\n        public boolean evaluate(ReadonlyConfig config, List<Map<String, Object>> entries)\n                throws OptionValidationException {\n            if (entries == null || entries.isEmpty()) {\n                return true;\n            }\n            for (int i = 0; i < entries.size(); i++) {\n                ReadonlyConfig tableConfig = ReadonlyConfig.fromMap(entries.get(i));\n                String topics = tableConfig.get(RocketMqSourceOptions.TOPICS);\n                if (topics == null || topics.trim().isEmpty()) {\n                    throw new OptionValidationException(\n                            \"tables_configs[%d]: 'topics' must not be empty\", i);\n                }\n                StartMode startMode =\n                        tableConfig.getOptional(RocketMqSourceOptions.START_MODE).orElse(null);\n                if (startMode == StartMode.CONSUME_FROM_TIMESTAMP) {\n                    Long ts =\n                            tableConfig\n                                    .getOptional(RocketMqSourceOptions.START_MODE_TIMESTAMP)\n                                    .orElse(null);\n                    if (ts == null) {\n                        throw new OptionValidationException(\n                                \"tables_configs[%d]: 'start.mode.timestamp' required \"\n                                        + \"when start.mode=CONSUME_FROM_TIMESTAMP\",\n                                i);\n                    }\n                    if (ts < 0) {\n                        throw new OptionValidationException(\n                                \"tables_configs[%d]: 'start.mode.timestamp' must be >= 0, got: %d\",","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-rocketmq/src/main/java/org/apache/seatunnel/connectors/seatunnel/rocketmq/source/RocketMqSourceFactory.java#L114-L150","documentation":"RocketMqSourceFactory.validate validates each entry of `tables_configs` at option-rule evaluation time. Each table entry must define a non-empty `topics` option; otherwise OptionValidationException is thrown with the entry index. This fails fast before any job resources are allocated.","triggerScenarios":"A `tables_configs` entry where `topics` is absent, null, empty string, or whitespace-only, detected in evaluate() while parsing entry i.","commonSituations":"Multi-table configs where one entry was pasted incompletely, YAML indentation errors leaving `topics` unset for one table, or `topics: \"\"` left as a placeholder.","solutions":["Add a non-empty `topics` value (comma-separated topic list) to every entry in tables_configs","Check YAML indentation so `topics` actually lands inside the intended table entry","Verify no entry has only whitespace, e.g. topics: \" \" which also fails validation"],"exampleFix":"// before\ntables_configs = [\n  { topic = \"\" }\n]\n// after\ntables_configs = [\n  { topics = \"order-events\" }\n]","handlingStrategy":"validation","validationCode":"config.getTablesConfigs().forEach(tc -> {\n    String topics = tc.get(\"topics\");\n    if (topics == null || topics.trim().isEmpty())\n        throw new IllegalArgumentException(\"every tables_configs entry needs non-empty 'topics'\");\n});","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a reviewed config template for multi-table sources","Run the connector's option validation (factory evaluate) locally before production submits","Avoid whitespace placeholder values like topics: \" \""],"tags":["config","validation","rocketmq"],"backgroundTag":"empty-required-field","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}