{"record":{"id":"a637557efdf53ecf","repo":"alibaba/canal","slug":"kudumapping-database","errorCode":null,"errorMessage":"KuduMapping.database","messagePattern":"KuduMapping\\.database","errorType":"validation","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"client-adapter/kudu/src/main/java/com/alibaba/otter/canal/client/adapter/kudu/config/KuduMappingConfig.java","lineNumber":84,"sourceCode":"    public KuduMapping getKuduMapping() {\n        return kuduMapping;\n    }\n\n    public void setKuduMapping(KuduMapping kuduMapping) {\n        this.kuduMapping = kuduMapping;\n    }\n\n    public String getDestination() {\n        return destination;\n    }\n\n    public void setDestination(String destination) {\n        this.destination = destination;\n    }\n\n    public void validate() {\n        if (kuduMapping.database == null || kuduMapping.database.isEmpty()) {\n            throw new NullPointerException(\"KuduMapping.database\");\n        }\n    }\n\n    public static class KuduMapping implements AdapterMapping {\n\n        private String              database;                           // 数据库名或schema名\n        private String              table;                              // 表名\n        private Map<String, String> targetPk    = new LinkedHashMap<>(); // 目标表主键字段\n        private boolean             mapAll      = false;                // 映射所有字段\n        private String              targetDb;                           // 目标库名\n        private String              targetTable;                        // 目标表名\n        private Map<String, String> targetColumns;                      // 目标表字段映射\n\n        private String              etlCondition;                       // etl条件sql\n\n        private int                 readBatch   = 5000;\n        private int                 commitBatch = 5000;                 // etl等批量提交大小\n","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/alibaba/canal/blob/87be50e87686a3e8af08c368d0e1ffd1f59eb04a/client-adapter/kudu/src/main/java/com/alibaba/otter/canal/client/adapter/kudu/config/KuduMappingConfig.java#L66-L102","documentation":"Thrown by KuduMappingConfig.validate() when kuduMapping.database is null or empty. Validation runs inside the config loader for each parsed yml, so this surfaces during startup of the kudu adapter, before any sync begins. database represents the source schema/database name used to route events.","triggerScenarios":"A kudu mapping yml is parsed successfully but its kuduMapping block omits 'database:' or sets it to an empty string, then validate() is called by KuduMappingConfigLoader.load().","commonSituations":"A new mapping yml was copied from a template and the 'database:' line was deleted or left blank. Indentation is wrong so 'database' is not parsed as a child of kuduMapping.","solutions":["Open the failing kudu yml and add a non-empty 'database:' under kuduMapping.","Verify the kuduMapping block is indented two spaces so 'database' is its child, not a top-level key.","Re-run startup; the error names only the missing field, so fix any subsequent validate failures reported next."],"exampleFix":"# before\nkuduMapping:\n  table: user\n# after\nkuduMapping:\n  database: mytest\n  table: user","handlingStrategy":"validation","validationCode":"// Pre-validate a parsed KuduMappingConfig before the loader does.\nKuduMapping m = config.getKuduMapping();\nif (m == null || m.getDatabase() == null || m.getDatabase().isEmpty()) {\n    throw new IllegalArgumentException(\n        \"kudu yml missing kuduMapping.database for \" + fileName);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always start a new kudu yml from the bundled kudu/kudutest_user.yml template which has all required fields.","Run a YAML linter / dry-load in CI to catch missing required keys before deploy."],"tags":["kudu","config-validation","canal","yaml"],"backgroundTag":null,"analyzedSha":"87be50e87686a3e8af08c368d0e1ffd1f59eb04a","analyzedAt":"2026-08-14T04:30:11.918Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}