alibaba/canal · error · NullPointerException
hbaseMapping.mode
Error message
hbaseMapping.mode
What it means
MappingConfig.validate() requires HbaseMapping.mode (one of STRING/NATIVE/PHOENIX) to be non-null. Note HbaseMapping defaults mode to STRING, so hitting this means the YAML explicitly set mode to null or the value failed to deserialize into the Mode enum.
Solutions
- Set 'mode: STRING' (or NATIVE/PHOENIX) explicitly, or omit 'mode' to use the STRING default.
- Confirm the mode value matches the enum constant exactly (case-sensitive).
- Verify the canal version supports the chosen mode enum value.
- Lint the YAML.
Example fix
# before (invalid mode) hbaseMapping: mode: STRING_TYPE # after hbaseMapping: mode: STRING
Defensive patterns
Strategy: validation
Validate before calling
MappingConfig cfg = ...;
if (cfg.getHbaseMapping() == null || cfg.getHbaseMapping().getMode() == null) {
throw new IllegalArgumentException("hbaseMapping.mode must be STRING, NATIVE, or PHOENIX");
} Try / catch
try {
config.validate();
} catch (NullPointerException e) {
if ("hbaseMapping.mode".equals(e.getMessage())) {
logger.error("Set mode: STRING|NATIVE|PHOENIX or omit to default to STRING");
}
throw e;
} Prevention
- Omit mode to use the STRING default, or set it to a valid enum constant.
- Confirm the canal build supports the chosen mode (e.g. PHOENIX).
- Lint YAML enum values.
When it happens
Trigger: HBase mapping YAML setting 'mode:' to null or to a value that is not STRING/NATIVE/PHOENIX (which would actually throw on enum binding); validate() during load.
Common situations: Setting an invalid mode string in the YAML; removing the default via explicit null; older canal version whose enum lacks PHOENIX.
Related errors
- hbaseMapping.database
- hbaseMapping.hbaseTable
- hbaseMapping.table
- 已配置了复合主键作为RowKey,无需再指定RowKey列
- clusterId and serverId are all empty
AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14).
Data as JSON: /api/errors/a06b560dda82df91.
Report an issue: GitHub.
Appendix: source
Thrown at client-adapter/hbase/src/main/java/com/alibaba/otter/canal/client/adapter/hbase/config/MappingConfig.java:80
this.hbaseMapping = hbaseMapping;
}
public AdapterMapping getMapping() {
return hbaseMapping;
}
public void validate() {
if (hbaseMapping.database == null || hbaseMapping.database.isEmpty()) {
throw new NullPointerException("hbaseMapping.database");
}
if (hbaseMapping.table == null || hbaseMapping.table.isEmpty()) {
throw new NullPointerException("hbaseMapping.table");
}
if (hbaseMapping.hbaseTable == null || hbaseMapping.hbaseTable.isEmpty()) {
throw new NullPointerException("hbaseMapping.hbaseTable");
}
if (hbaseMapping.mode == null) {
throw new NullPointerException("hbaseMapping.mode");
}
if (hbaseMapping.rowKey != null && hbaseMapping.rowKeyColumn != null) {
throw new RuntimeException("已配置了复合主键作为RowKey,无需再指定RowKey列");
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MappingConfig config = (MappingConfig) o;
return hbaseMapping != null ? hbaseMapping.equals(config.hbaseMapping) : config.hbaseMapping == null;
}
@Override
public int hashCode() {View on GitHub (pinned to 87be50e876)