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

' ' duplicate in options.

Error message

%s '%s' duplicate in %s options.

What it means

Thrown during OptionRule validation when the same Option is registered more than once inside a ConditionalRequiredOptions expression — i.e. the developer reused one option key as both a condition and a required option (or repeated it as a condition) in a conditional() rule. It is a config-definition build-time guard, not a runtime data error: the faulty input is the duplicated Option instance passed to OptionRule's conditional builder.

Solutions

  1. Inspect the conditional() rule in the failing factory's OptionRule and remove the duplicate option from either the condition list or the required-option list
  2. Use distinct Option instances (different keys) for the condition and the required options of the rule
  3. If the same key must be referenced, reuse the same Option constant instead of declaring a second Option with an identical key
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java:523 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/4cb54ae7cfe8d9f8. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/OptionRule.java:523

                                                                    .ConditionalRequiredOptions) {
                                                Option<?> requiredOptionCondition =
                                                        ((RequiredOption.ConditionalRequiredOptions)
                                                                        requiredOption)
                                                                .getExpression()
                                                                .getCondition()
                                                                .getOption();

                                                Option<?> roOptionCondition =
                                                        ((RequiredOption.ConditionalRequiredOptions)
                                                                        ro)
                                                                .getExpression()
                                                                .getCondition()
                                                                .getOption();

                                                if (ro.getOptions().contains(option)
                                                        && !requiredOptionCondition.equals(
                                                                roOptionCondition)) {
                                                    throw new OptionValidationException(
                                                            String.format(
                                                                    "%s '%s' duplicate in %s options.",
                                                                    requiredOption
                                                                            .getClass()
                                                                            .getSimpleName(),
                                                                    option.key(),
                                                                    ro.getClass().getSimpleName()));
                                                }
                                            } else {
                                                if (ro.getOptions().contains(option)) {
                                                    throw new OptionValidationException(
                                                            String.format(
                                                                    "%s '%s' duplicate in %s options.",
                                                                    requiredOption
                                                                            .getClass()
                                                                            .getSimpleName(),
                                                                    option.key(),
                                                                    ro.getClass().getSimpleName()));

View on GitHub (pinned to cf67b549a7)