{"record":{"id":"18000ddbc4926a82","repo":"apache/seatunnel","slug":"option-validation-failed-d-error-s","errorCode":null,"errorMessage":"Option validation failed (%d error%s):","messagePattern":"Option validation failed \\((.+?) error(.+?)\\):","errorType":"validation","errorClass":"org.apache.seatunnel.api.configuration.util.OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/ConfigValidator.java","lineNumber":183,"sourceCode":"    }\n\n    public void validate(OptionRule rule) {\n        validate(rule, null);\n    }\n\n    public void validate(OptionRule rule, Expression expression) {\n        List<String> errors = new ArrayList<>();\n        collectErrors(rule, expression, errors);\n        if (!errors.isEmpty()) {\n            StringBuilder sb = new StringBuilder();\n            sb.append(\n                    String.format(\n                            \"Option validation failed (%d error%s):\",\n                            errors.size(), errors.size() > 1 ? \"s\" : \"\"));\n            for (int i = 0; i < errors.size(); i++) {\n                sb.append(String.format(\"\\n  [%d] %s\", i + 1, errors.get(i)));\n            }\n            throw new OptionValidationException(sb.toString());\n        }\n    }\n\n    private void collectErrors(OptionRule rule, Expression expression, List<String> errors) {\n        Set<String> structurallyAbsentKeys = new HashSet<>();\n\n        for (RequiredOption requiredOption : rule.getRequiredOptions()) {\n            String error = checkRequiredOption(requiredOption, expression);\n            if (error != null) {\n                errors.add(error);\n                collectAbsentKeys(requiredOption, structurallyAbsentKeys);\n            }\n\n            for (Option<?> option : requiredOption.getOptions()) {\n                if (SingleChoiceOption.class.isAssignableFrom(option.getClass())) {\n                    if (isConditionOption(requiredOption)\n                            && !matchCondition(\n                                    (RequiredOption.ConditionalRequiredOptions) requiredOption)) {","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/ConfigValidator.java#L165-L201","documentation":"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.","triggerScenarios":"Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/configuration/util/ConfigValidator.java:183 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}