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

conditional option rule for

Error message

conditional option rule for '%s' must have options.

What it means

A developer-facing builder guard in OptionRule.Builder.conditionalRule: the nested OptionRule attached for a conditional option contains no options at all, making the conditional rule useless. The faulting input is the conditionalOptionRule argument.

Solutions

  1. Build the conditional OptionRule with at least one optional or required option before passing it
  2. Check that the nested rule's builder had options added and build() was called correctly
  3. Fix the connector's OptionRule definition code, not the user config
Defensive patterns

Strategy: validation

When it happens

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

Appendix: source

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

            this.requiredOptions.add(bundledRequiredOption);
            return this;
        }

        public <T> Builder conditionalRule(
                @NonNull Option<T> conditionalOption,
                @NonNull List<T> expectValues,
                @NonNull OptionRule conditionalOptionRule) {
            verifyConditionalExists(conditionalOption);

            if (expectValues.isEmpty()) {
                throw new OptionValidationException(
                        String.format(
                                "conditional option '%s' must have expect values .",
                                conditionalOption.key()));
            }

            if (!conditionalOptionRule.hasOptions()) {
                throw new OptionValidationException(
                        String.format(
                                "conditional option rule for '%s' must have options.",
                                conditionalOption.key()));
            }

            Expression expression =
                    expectValues.stream()
                            .map(v -> Expression.of(Condition.of(conditionalOption, v)))
                            .reduce(Expression::or)
                            .get();

            if (conditionRulesMap.containsKey(expression)) {
                throw new OptionValidationException(
                        String.format(
                                "conditional option rule for '%s' with expression '%s' already exists.",
                                conditionalOption.key(), expression.toString()));
            }
            this.conditionRulesMap.put(expression, conditionalOptionRule);

View on GitHub (pinned to cf67b549a7)