apache/seatunnel · error · IllegalArgumentException

Unknown MetaLakeTypeMapper type:

Error message

Unknown MetaLakeTypeMapper type: 

What it means

IllegalArgumentException thrown by MetaLakeFactory.createTypeMapper when the given MetaLakeType has no registered MetaLakeTableSchemaConvertor in MAPPER_REGISTRY. Same registry/enum mismatch pattern as createClient but for the type-mapping (schema conversion) side.

Source

Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/metalake/MetaLakeFactory.java:59

        CLIENT_REGISTRY.put(type.toLowerCase(), GravitinoClient::new);
        MAPPER_REGISTRY.put(type.toLowerCase(), GravitinoTableSchemaConvertor::new);
    }

    public static MetalakeClient createClient(MetaLakeType metaLakeType) {
        String type = metaLakeType.name().toLowerCase();
        Supplier<MetalakeClient> constructor = CLIENT_REGISTRY.get(type.toLowerCase());
        if (constructor == null) {
            throw new IllegalArgumentException("Unknown MetalakeClient type: " + type);
        }
        return constructor.get();
    }

    public static MetaLakeTableSchemaConvertor createTypeMapper(MetaLakeType metaLakeType) {
        String type = metaLakeType.name().toLowerCase();
        Supplier<MetaLakeTableSchemaConvertor> constructor =
                MAPPER_REGISTRY.get(type.toLowerCase());
        if (constructor == null) {
            throw new IllegalArgumentException("Unknown MetaLakeTypeMapper type: " + type);
        }
        return constructor.get();
    }
}

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Register a MetaLakeTableSchemaConvertor supplier for the type in MAPPER_REGISTRY.
  2. Verify the registry key equals the enum name lowercased.
  3. Rebuild so factory and enum come from the same version.
  4. Add a test asserting createTypeMapper succeeds for every MetaLakeType value.

Example fix

// before
Supplier<MetaLakeTableSchemaConvertor> mapper = MAPPER_REGISTRY.get(type);
// after (registration side)
MAPPER_REGISTRY.put("gravitino", GravitinoTableSchemaConvertor::new);
Defensive patterns

Strategy: validation

Validate before calling

// registry-coverage test
test void allTypesHaveMappers() {
    for (MetaLakeType t : MetaLakeType.values()) {
        assertNotNull(MetaLakeFactory.createTypeMapper(t));
    }
}

Try / catch

try {
    return MetaLakeFactory.createTypeMapper(type);
} catch (IllegalArgumentException e) {
    throw new IllegalStateException("No MetaLakeTableSchemaConvertor registered for " + type, e);
}

Prevention

When it happens

Trigger: Calling createTypeMapper(MetaLakeType.X) where X.name().toLowerCase() is absent from MAPPER_REGISTRY — a MetaLakeType added without a corresponding convertor registration.

Common situations: Adding a new metalake type enum and forgetting the mapper entry; classpath mixing old factory code with a new enum; typo between the registry key and the enum lowercase name.

Related errors


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