apache/seatunnel · error · UnsupportedOperationException

getProducedCatalogTables method has not been implemented.

Error message

getProducedCatalogTables method has not been implemented.

What it means

SeaTunnelSource.getProducedCatalogTables has a default implementation that throws UnsupportedOperationException. The framework increasingly relies on CatalogTable (rich schema metadata) instead of the legacy getProducedType, so sources that have not migrated to implement this method fail when downstream code requests catalog tables.

Source

Thrown at seatunnel-api/src/main/java/org/apache/seatunnel/api/source/SeaTunnelSource.java:68

    /**
     * Get the data type of the records produced by this source.
     *
     * @deprecated Please use {@link #getProducedCatalogTables}
     * @return SeaTunnel data type.
     */
    @Deprecated
    default SeaTunnelDataType<T> getProducedType() {
        return (SeaTunnelDataType) getProducedCatalogTables().get(0).getSeaTunnelRowType();
    }

    /**
     * Get the catalog tables output by this source, It is recommended that all connectors implement
     * this method instead of {@link #getProducedType}. CatalogTable contains more information to
     * help downstream support more accurate and complete synchronization capabilities.
     */
    default List<CatalogTable> getProducedCatalogTables() {
        throw new UnsupportedOperationException(
                "getProducedCatalogTables method has not been implemented.");
    }

    /**
     * Create source reader, used to produce data.
     *
     * @param readerContext reader context.
     * @return source reader.
     * @throws Exception when create reader failed.
     */
    SourceReader<T, SplitT> createReader(SourceReader.Context readerContext) throws Exception;

    /**
     * Create split serializer, use to serialize/deserialize split generated by {@link
     * SourceSplitEnumerator}.
     *
     * @return split serializer.
     */

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Implement getProducedCatalogTables() in the Source, returning List<CatalogTable> built from the connector's schema
  2. As a stopgap, ensure the job path uses getProducedType or supply schema info via source config if the connector supports it
  3. Update/rebuild the connector against the current SeaTunnel API version

Example fix

// before
// Source relies on default method
// after
@Override
public List<CatalogTable> getProducedCatalogTables() {
    return Collections.singletonList(CatalogTable.of(...));
}
Defensive patterns

Strategy: fallback

Validate before calling

List<CatalogTable> tables;
try { tables = source.getProducedCatalogTables(); } catch (UnsupportedOperationException e) { tables = legacyFromProducedType(source); }

Try / catch

try { tables = src.getProducedCatalogTables(); } catch (UnsupportedOperationException e) { /* fallback to getProducedType */ }

Prevention

When it happens

Trigger: Calling getProducedCatalogTables() on a custom or older connector Source that only implements getProducedType(); any pipeline path (getProducedType fallback, restoreAndPrepareSource, reader creation) that resolves produced type via catalog tables.

Common situations: Using a third-party or hand-written Source written against an older SeaTunnel API version; upgrading the engine while keeping an old custom connector jar.

Understand the failure class

Background: "NotImplementedError: Subclasses should override this method" / "must be implemented" — abstract method errors explained — this error's family across 40 libraries.

Related errors


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