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
- Read each error listed under the summary and fix the corresponding option in the job config
- Ensure all required options are present and conditional constraints are met
- 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)