{"record":{"id":"7eacec89b8f4ce54","repo":"apache/seatunnel","slug":"the-s-option-is-not-configured-please-configur","errorCode":null,"errorMessage":"The '%s' option is not configured, please configure it.","messagePattern":"The '(.+?)' option is not configured, please configure it\\.","errorType":"validation","errorClass":"JobDefineCheckException","httpStatus":null,"severity":"error","filePath":"seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java","lineNumber":267,"sourceCode":"                                \"The transform/sink(%s) is not configured with '%s' option\",\n                                config.getString(PLUGIN_NAME.key()), PLUGIN_INPUT.key()),\n                        new OptionValidationException(PLUGIN_INPUT));\n            }\n        }\n    }\n\n    private static String getTableId(ReadonlyConfig config) {\n        return config.getOptional(PLUGIN_OUTPUT).orElse(DEFAULT_ID);\n    }\n\n    static List<String> getInputIds(ReadonlyConfig config) {\n        return config.getOptional(PLUGIN_INPUT).orElse(Collections.singletonList(DEFAULT_ID));\n    }\n\n    public static String getFactoryId(ReadonlyConfig readonlyConfig) {\n        String pluginName = readonlyConfig.get(PLUGIN_NAME);\n        if (StringUtils.isBlank(pluginName)) {\n            throw new JobDefineCheckException(\n                    String.format(\n                            \"The '%s' option is not configured, please configure it.\",\n                            PLUGIN_NAME.key()));\n        }\n        return pluginName;\n    }\n\n    public static String getFactoryId(Config config) {\n        return getFactoryId(ReadonlyConfig.fromConfig(config));\n    }\n\n    private enum VertexStatus {\n        CREATED,\n        LINKED\n    }\n}\n","sourceCodeStart":249,"sourceCodeEnd":284,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java#L249-L284","documentation":"getFactoryId extracts the plugin name (plugin_name) from a ReadonlyConfig to resolve the plugin factory id. If the plugin_name option is blank or missing, JobDefineCheckException is thrown asking the user to configure it. Without a plugin name, the engine cannot locate the Source/Transform/Sink factory.","triggerScenarios":"Calling getFactoryId with a config whose plugin_name key is absent, empty, or whitespace-only; typically during DAG edge building (checkEdge) when parsing plugin blocks.","commonSituations":"Plugin block uses only the class-style syntax but the name was not parsed; config key misspelled (e.g. plug_name); programmatically built ReadonlyConfig missing PLUGIN_NAME; empty transform block.","solutions":["Add plugin_name = \"<PluginName>\" to the plugin block in the job config","Fix the option key spelling so it is exactly plugin_name","Ensure the plugin block is not empty (every source/transform/sink needs a name)","If building config programmatically, set ReadonlyOptionValue for PLUGIN_NAME before calling getFactoryId"],"exampleFix":"// before\ntransform {\n  Sql { query = \"select 1\" }\n}\n// after\ntransform {\n  Sql {\n    plugin_name = \"Sql\"\n    query = \"select 1\"\n  }\n}","handlingStrategy":"validation","validationCode":"if (config.getOptional(\"plugin_name\").map(String::isBlank).orElse(true)) {\n    throw new IllegalArgumentException(\"plugin_name is required in every plugin block\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    String factoryId = ConfigParserUtil.getFactoryId(readonlyConfig);\n} catch (JobDefineCheckException e) {\n    log.error(\"Plugin block missing plugin_name: {}\", e.getMessage());\n    throw e;\n}","preventionTips":["Always set plugin_name in every plugin block","Spell the key exactly as plugin_name","Never leave plugin blocks empty","Validate ReadonlyConfig before passing to getFactoryId"],"tags":["java","job-config","missing-option","plugin-name"],"backgroundTag":"missing-required-option","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"}