{"record":{"id":"f69fb27596974fd3","repo":"apache/seatunnel","slug":"commonerror-converttoconnectorpropsblankerror-pa","errorCode":null,"errorMessage":"${CommonError.convertToConnectorPropsBlankError(Paimon, propKey)}","messagePattern":"\\$\\{CommonError\\.convertToConnectorPropsBlankError\\(Paimon, propKey\\)\\}","errorType":"validation","errorClass":"SeaTunnelException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/config/PaimonConfig.java","lineNumber":85,"sourceCode":"        this.namespace = readonlyConfig.get(PaimonBaseOptions.DATABASE);\n        this.table = readonlyConfig.get(PaimonBaseOptions.TABLE);\n        this.hdfsSitePath = readonlyConfig.get(PaimonBaseOptions.HDFS_SITE_PATH);\n        this.hadoopConfProps = readonlyConfig.get(PaimonBaseOptions.HADOOP_CONF);\n        this.hadoopConfPath = readonlyConfig.get(PaimonBaseOptions.HADOOP_CONF_PATH);\n        this.catalogType = readonlyConfig.get(PaimonBaseOptions.CATALOG_TYPE);\n        if (PaimonCatalogEnum.HIVE.getType().equals(catalogType.getType())) {\n            this.catalogUri =\n                    checkArgumentNotBlank(\n                            readonlyConfig.get(PaimonBaseOptions.CATALOG_URI),\n                            PaimonBaseOptions.CATALOG_URI.key());\n        }\n        this.user = readonlyConfig.get(PaimonBaseOptions.USER);\n        this.password = readonlyConfig.get(PaimonBaseOptions.PASSWORD);\n    }\n\n    protected String checkArgumentNotBlank(String propValue, String propKey) {\n        if (StringUtils.isBlank(propValue)) {\n            throw new SeaTunnelException(\n                    CommonError.convertToConnectorPropsBlankError(\"Paimon\", propKey));\n        }\n        return propValue;\n    }\n\n    protected static List<String> stringToList(String value, String regex) {\n        if (value == null || value.isEmpty()) {\n            return ImmutableList.of();\n        }\n        return Arrays.stream(value.split(regex)).map(String::trim).collect(toList());\n    }\n}\n","sourceCodeStart":67,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/config/PaimonConfig.java#L67-L98","documentation":"PaimonConfig.checkArgumentNotBlank validates a connector property and, when the value is blank, throws SeaTunnelException carrying CommonError.convertToConnectorPropsBlankError(\"Paimon\", propKey) — a standardized 'Paimon property <key> cannot be blank' message. PaimonConfig's constructor uses it for required string options (e.g. user/password/warehouse-related fields) that must be non-empty for the connector to function.","triggerScenarios":"Instantiating PaimonConfig (from a SeaTunnel ReadonlyConfig) where a required string option such as PaimonBaseOptions.USER or PASSWORD resolves to blank (empty or whitespace) and passes through checkArgumentNotBlank.","commonSituations":"Credentials supplied as empty strings from templated configs; env-var placeholders that resolved to nothing; copying a config sample and leaving a value empty; whitespace-only values that look non-empty in YAML/HOCON.","solutions":["Set the reported property (see propKey in the message) to a real non-blank value in the SeaTunnel connector config.","Fix variable/secret substitution so placeholders resolve before job submission.","Quote and trim values in HOCON/YAML to avoid accidental whitespace-only strings.","Validate required options in your submission pipeline before launching the job."],"exampleFix":"// before\nPaimon {\n  user = \"\"\n  password = \"\"\n}\n// after\nPaimon {\n  user = \"etl_user\"\n  password = \"${PAIMON_PASSWORD}\"\n}","handlingStrategy":"validation","validationCode":"for (Option<String> opt : List.of(PaimonBaseOptions.USER, PaimonBaseOptions.PASSWORD)) {\n    String v = readonlyConfig.get(opt);\n    if (v == null || v.trim().isEmpty()) {\n        throw new ConfigValidationException(opt.key() + \" must be non-blank\");\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    PaimonConfig cfg = new PaimonConfig(readonlyConfig);\n} catch (SeaTunnelException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"cannot be blank\")) {\n        LOG.error(\"fill in the reported Paimon option before submitting\");\n    }\n    throw e;\n}","preventionTips":["Validate required string options in CI before job submission","Use secret injection that fails loudly on empty values","Quote whitespace-sensitive values in HOCON/YAML","Mirror required-option checks in the submission wrapper"],"tags":["paimon","configuration","blank-property","validation"],"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-14T11:17:12.474Z"}