{"record":{"id":"39f5c7f42076a0bb","repo":"apache/seatunnel","slug":"validationmode-failed-message","errorCode":null,"errorMessage":"${validationMode} failed: ${message}","messagePattern":"(.+?) failed: (.+?)","errorType":"validation","errorClass":"ConfigCheckException","httpStatus":null,"severity":"error","filePath":"seatunnel-core/seatunnel-starter/src/main/java/org/apache/seatunnel/core/starter/seatunnel/command/SeaTunnelConfValidateCommand.java","lineNumber":194,"sourceCode":"            if (clientCommandArgs.getDryRun() == DryRun.CONNECT) {\n                new DryRunConnectValidator(\n                                sourceConfigs,\n                                transformConfigs,\n                                sinkConfigs,\n                                sourceAndTransformClassLoader,\n                                sinkClassLoader)\n                        .validate();\n            }\n\n        } catch (Exception e) {\n            String validationMode =\n                    clientCommandArgs.getDryRun() == DryRun.CONNECT\n                            ? \"Connectivity check\"\n                            : \"Static analysis\";\n            String message = e.getMessage();\n            if (clientCommandArgs.getDryRun() == DryRun.CONNECT) {\n                message = DryRunConnectFailureMessageSanitizer.sanitize(message);\n                throw new ConfigCheckException(validationMode + \" failed: \" + message);\n            }\n            throw new ConfigCheckException(validationMode + \" failed: \" + message, e);\n        }\n    }\n\n    /**\n     * Validate the configuration and return a reusable result for non-CLI integrations.\n     *\n     * <p>The result is deliberately config-level and does not claim runtime-equivalent validation.\n     */\n    public ConfigValidationResult validateResult() {\n        try {\n            execute();\n            return ConfigValidationResult.success(validationPhase());\n        } catch (ConfigCheckException e) {\n            String message = e.getMessage();\n            String prefix = validationMode() + \" failed: \";\n            if (message != null && message.startsWith(prefix)) {","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-core/seatunnel-starter/src/main/java/org/apache/seatunnel/core/starter/seatunnel/command/SeaTunnelConfValidateCommand.java#L176-L212","documentation":"SeaTunnelConfValidateCommand.execute catches exceptions raised while validating a config under --dry-run and rethrows them as ConfigCheckException with the message '<validationMode> failed: <message>', where validationMode is 'Connectivity check' (DryRun.CONNECT) or 'Static analysis'. For CONNECT mode the message is additionally passed through DryRunConnectFailureMessageSanitizer before wrapping. The original exception is attached except in the sanitized CONNECT branch.","triggerScenarios":"Running with --dry-run CONNECT or STATIC when the underlying validation throws — e.g. any of the ConfigCheckExceptions from DryRunConnectValidator (2564-2567), a connector factory instantiation failure, or a config parse error during static analysis.","commonSituations":"Pre-submit config validation in CI; developers checking connectivity of source/sink options; configs with schema mismatches or missing upstreams (see related errors); invalid plugin names that fail factory lookup.","solutions":["Read the <message> after 'failed:' — it names the plugin and the specific validation problem.","Fix the config issue indicated (schema mismatch, missing upstream, failed connectivity) and re-run the dry run.","If the sanitizer stripped details needed for debugging, re-run with the raw engine logs or STATIC mode to see the full exception.","Validate connector option names against the connector's documentation/option rules."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// run the dry-run in CI and parse the wrapped message to route failures\n// seatunnel.sh --config job.conf --dry-run CONNECT || handle_failure","typeGuard":null,"tryCatchPattern":"try { validateConf(conf, dryRun); } catch (ConfigCheckException e) { String msg = e.getMessage(); if (msg.startsWith(\"Connectivity check failed:\")) { handleConnectivity(msg); } else if (msg.startsWith(\"Static analysis failed:\")) { handleStatic(msg); } else { throw e; } }","preventionTips":["Always dry-run configs in CI before production submission","Parse the message after 'failed:' to classify the root problem","Keep connector option names matched to the current version's docs","Remember the sanitized CONNECT message may omit detail — check engine logs for the full stack"],"tags":["dry-run","config-validation","wrapper-exception"],"backgroundTag":"invalid-config-value","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}