apache/seatunnel · error · ConfigCheckException

At least one source plugin must be configured.

Error message

At least one source plugin must be configured.

What it means

validate requires the job config to declare at least one source plugin under the 'source' block. If the resulting source table list is empty it throws ConfigCheckException('At least one source plugin must be configured.').

Solutions

  1. Add a source { ... } block with a valid plugin to the job config
  2. Ensure 'source' is a list of plugin configs per HOCON conventions
  3. Verify the plugin name inside source is recognized (no silent filtering)

Example fix

// before
env {...}
sink { Console {} }
// after
env {...}
source { Fake { rows = 10 } }
sink { Console {} }
Defensive patterns

Strategy: validation

Validate before calling

boolean hasSource = config.hasPath("source") && !config.getConfigList("source").isEmpty(); if (!hasSource) throw new IllegalArgumentException("config must define a source block");

Try / catch

try { ConfigValidationUtils.validate(config); } catch (ConfigCheckException e) { log.error("Job config invalid: {}", e.getMessage()); }

Prevention

When it happens

Trigger: A job config with no 'source' section, an empty source list, or a source section whose entries were filtered out by TypesafeConfigUtils.getConfigList (wrong type, e.g. source as object instead of array).

Common situations: Copy-pasting only the sink half of an example, renaming 'source' to something else, or writing source as a single object when a list is expected.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/746358f15993205b. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-core/seatunnel-core-starter/src/main/java/org/apache/seatunnel/core/starter/utils/ConfigValidationUtils.java:133

            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.");
            }

            List<TableInfo> outputTables =
                    validateTransforms(
                            sourceTables,
                            TypesafeConfigUtils.getConfigList(
                                    config, Constants.TRANSFORM, Collections.emptyList()),
                            jobContext);

            validateSinks(
                    outputTables,
                    TypesafeConfigUtils.getConfigList(
                            config, Constants.SINK, Collections.emptyList()),
                    jobContext);
        } catch (ConfigCheckException e) {
            throw e;
        } catch (Exception e) {
            Throwable rootException = ExceptionUtils.getRootException(e);

View on GitHub (pinned to cf67b549a7)