apache/seatunnel · error · JobDefineCheckException

The ' ' option is not configured, please configure it.

Error message

The '%s' option is not configured, please configure it.

What it means

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.

Solutions

  1. Add plugin_name = "<PluginName>" to the plugin block in the job config
  2. Fix the option key spelling so it is exactly plugin_name
  3. Ensure the plugin block is not empty (every source/transform/sink needs a name)
  4. If building config programmatically, set ReadonlyOptionValue for PLUGIN_NAME before calling getFactoryId

Example fix

// before
transform {
  Sql { query = "select 1" }
}
// after
transform {
  Sql {
    plugin_name = "Sql"
    query = "select 1"
  }
}
Defensive patterns

Strategy: validation

Validate before calling

if (config.getOptional("plugin_name").map(String::isBlank).orElse(true)) {
    throw new IllegalArgumentException("plugin_name is required in every plugin block");
}

Try / catch

try {
    String factoryId = ConfigParserUtil.getFactoryId(readonlyConfig);
} catch (JobDefineCheckException e) {
    log.error("Plugin block missing plugin_name: {}", e.getMessage());
    throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "Must pass :limit option" / "Missing required option" — required option errors explained — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/7eacec89b8f4ce54. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-core/src/main/java/org/apache/seatunnel/engine/core/parse/ConfigParserUtil.java:267

                                "The transform/sink(%s) is not configured with '%s' option",
                                config.getString(PLUGIN_NAME.key()), PLUGIN_INPUT.key()),
                        new OptionValidationException(PLUGIN_INPUT));
            }
        }
    }

    private static String getTableId(ReadonlyConfig config) {
        return config.getOptional(PLUGIN_OUTPUT).orElse(DEFAULT_ID);
    }

    static List<String> getInputIds(ReadonlyConfig config) {
        return config.getOptional(PLUGIN_INPUT).orElse(Collections.singletonList(DEFAULT_ID));
    }

    public static String getFactoryId(ReadonlyConfig readonlyConfig) {
        String pluginName = readonlyConfig.get(PLUGIN_NAME);
        if (StringUtils.isBlank(pluginName)) {
            throw new JobDefineCheckException(
                    String.format(
                            "The '%s' option is not configured, please configure it.",
                            PLUGIN_NAME.key()));
        }
        return pluginName;
    }

    public static String getFactoryId(Config config) {
        return getFactoryId(ReadonlyConfig.fromConfig(config));
    }

    private enum VertexStatus {
        CREATED,
        LINKED
    }
}

View on GitHub (pinned to cf67b549a7)