apache/seatunnel · error · ConfigCheckException
checkResult.getMsg()
Error message
checkResult.getMsg()
What it means
ConfigValidationUtils.validate checks the provided CheckResult and throws ConfigCheckException(checkResult.getMsg()) when it is not a success, then proceeds with plugin validation. The message text is whatever the failed check produced (the message shown is the msg accessor used at that throw site).
Source
Thrown at seatunnel-core/seatunnel-core-starter/src/main/java/org/apache/seatunnel/core/starter/utils/ConfigValidationUtils.java:115
for (URL url : urls) {
method.get().invoke(classLoader, url);
}
} catch (Exception e) {
throw new RuntimeException(
"Unsupported classloader: " + classLoader.getClass().getName(), e);
}
}
};
private ConfigValidationUtils() {}
public static void validate(Config config) {
validate(config, CheckResult.success());
}
public static void validate(Config config, CheckResult checkResult) {
if (!checkResult.isSuccess()) {
throw new ConfigCheckException(checkResult.getMsg());
}
ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader validationClassLoader = prepareClassLoader(config, parentClassLoader);
Thread.currentThread().setContextClassLoader(validationClassLoader);
try {
validateEnvironmentConfig(config);
JobContext jobContext = new JobContext();
jobContext.setJobMode(RuntimeEnvironment.getJobMode(config));
jobContext.setEnableCheckpoint(RuntimeEnvironment.getEnableCheckpoint(config));
List<TableInfo> sourceTables =
validateSources(
TypesafeConfigUtils.getConfigList(
config, Constants.SOURCE, Collections.emptyList()),
jobContext);
if (sourceTables.isEmpty()) {
throw new ConfigCheckException("At least one source plugin must be configured.");View on GitHub (pinned to cf67b549a7)
Solutions
- Read the exception message (the check's msg) and fix the corresponding config option
- Run the config through the plugin docs to satisfy required options before validating
- In tests, expect ConfigCheckException for invalid configs; ensure success results are built with CheckResult.success()
Example fix
// before
CheckResult r = sourceFactory.check(cfg);
ConfigValidationUtils.validate(config, r);
// after
CheckResult r = sourceFactory.check(cfg);
if (!r.isSuccess()) { log.error("Config invalid: {}", r.getMsg()); return; }
ConfigValidationUtils.validate(config, r); Defensive patterns
Strategy: validation
Validate before calling
CheckResult r = factory.check(cfg); if (!r.isSuccess()) { throw new ConfigCheckException(r.getMsg()); } Try / catch
try { ConfigValidationUtils.validate(config, checkResult); } catch (ConfigCheckException e) { log.error("Config check failed: {}", e.getMessage()); } Prevention
- Always run plugin factory check() before validate
- Build success results with CheckResult.success()
- Surface r.getMsg() to users verbatim
When it happens
Trigger: Calling ConfigValidationUtils.validate(config, checkResult) with a failed CheckResult, typically from testValidSourceConfiguration/testValidSinkConfiguration after plugin check() reported an error.
Common situations: Plugin factory checks (missing options, invalid ranges) return failed CheckResults; unit tests using assertInvalid; hand-built CheckResult passed by mistake.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- Schema config can not be empty
- Unknown format type:
- Option '${option}' cannot be blank
- Option '${valuesAndOptions[index + 1]}' is not valid for the
- Option 'field_delimiter' cannot be empty
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/b600f4bd9a961e74.
Report an issue: GitHub.