{"record":{"id":"50e7364dd062d084","repo":"apache/seatunnel","slug":"key-is-required","errorCode":null,"errorMessage":"${key} is required","messagePattern":"(.+?) is required","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/catalog/PaimonCatalogLoader.java","lineNumber":136,"sourceCode":"            return catalog;\n        } catch (Exception e) {\n            throw new PaimonConnectorException(\n                    PaimonConnectorErrorCode.LOAD_CATALOG, e.getMessage(), e);\n        }\n    }\n\n    void checkConfiguration(Configuration configuration, String key) {\n        Iterator<Map.Entry<String, String>> entryIterator = configuration.iterator();\n        while (entryIterator.hasNext()) {\n            Map.Entry<String, String> entry = entryIterator.next();\n            if (entry.getKey().equals(key)) {\n                if (StringUtils.isBlank(entry.getValue())) {\n                    throw new IllegalArgumentException(\"The value of\" + key + \" is required\");\n                }\n                return;\n            }\n        }\n        throw new IllegalArgumentException(key + \" is required\");\n    }\n}\n","sourceCodeStart":118,"sourceCodeEnd":139,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/catalog/PaimonCatalogLoader.java#L118-L139","documentation":"PaimonCatalogLoader.checkConfiguration scans the Paimon Configuration for a required key and throws IllegalArgumentException \"<key> is required\" when the key is entirely absent. This enforces that mandatory Paimon settings (e.g. security or metastore properties) exist before the catalog is used.","triggerScenarios":"loadCatalog -> checkConfiguration(configuration, key) where the key does not appear at all in the loaded Paimon Configuration (paimon-conf files or programmatically built options), e.g. missing security.kerberos.principal in the conf.","commonSituations":"Fresh deployment where paimon conf was not copied/included; typo in the property name so the loader cannot find it; conf file not mounted into the container; renaming a property in a newer Paimon version.","solutions":["Add the missing key with a valid value to the Paimon configuration file referenced by paimon-conf-dir.","Verify the exact key spelling expected by the loader (string match, case-sensitive).","Ensure the conf directory/file is actually present and readable at runtime (mounted volume, packaged resource).","Check for version-specific property renames between your Paimon version and the connector's expectation."],"exampleFix":"// before (paimon conf missing entry)\nwarehouse = hdfs://ns/paimon\n// after\nwarehouse = hdfs://ns/paimon\nsecurity.kerberos.principal = etl_user@REALM","handlingStrategy":"validation","validationCode":"Set<String> required = Set.of(\"security.kerberos.principal\");\nfor (String key : required) {\n    if (!configuration.containsKey(key)) {\n        throw new ConfigValidationException(key + \" missing from paimon conf\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    loader.loadCatalog();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().endsWith(\" is required\")) {\n        LOG.error(\"add missing paimon conf key: {}\", e.getMessage());\n    }\n    throw e;\n}","preventionTips":["Keep a canonical paimon conf checklist per deployment","Verify conf files are mounted/readable in containers","Match key names exactly (case-sensitive)","Check property renames when upgrading Paimon"],"tags":["paimon","configuration","missing-key","validation"],"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"}