apache/seatunnel · error · org.apache.seatunnel.api.configuration.util.OptionValidationException

Option validation failed

Error message

Option validation failed (%d error%s):

What it means

An aggregate validation guard in ConfigValidator.validate: after collecting all rule violations for an OptionRule (required options, conditions, etc.), at least one error was found, so validation fails with a summary listing every error. It fires whenever the assembled option rule is not satisfied by the provided config.

Solutions

  1. Read each error listed under the summary and fix the corresponding option in the job config
  2. Ensure all required options are present and conditional constraints are met
  3. Run validation locally before submitting the job to catch all errors at once
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/ConfigValidator.java:183 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/ConfigValidator.java:183

    }

    public void validate(OptionRule rule) {
        validate(rule, null);
    }

    public void validate(OptionRule rule, Expression expression) {
        List<String> errors = new ArrayList<>();
        collectErrors(rule, expression, errors);
        if (!errors.isEmpty()) {
            StringBuilder sb = new StringBuilder();
            sb.append(
                    String.format(
                            "Option validation failed (%d error%s):",
                            errors.size(), errors.size() > 1 ? "s" : ""));
            for (int i = 0; i < errors.size(); i++) {
                sb.append(String.format("\n  [%d] %s", i + 1, errors.get(i)));
            }
            throw new OptionValidationException(sb.toString());
        }
    }

    private void collectErrors(OptionRule rule, Expression expression, List<String> errors) {
        Set<String> structurallyAbsentKeys = new HashSet<>();

        for (RequiredOption requiredOption : rule.getRequiredOptions()) {
            String error = checkRequiredOption(requiredOption, expression);
            if (error != null) {
                errors.add(error);
                collectAbsentKeys(requiredOption, structurallyAbsentKeys);
            }

            for (Option<?> option : requiredOption.getOptions()) {
                if (SingleChoiceOption.class.isAssignableFrom(option.getClass())) {
                    if (isConditionOption(requiredOption)
                            && !matchCondition(
                                    (RequiredOption.ConditionalRequiredOptions) requiredOption)) {

View on GitHub (pinned to cf67b549a7)