provectus/kafka-ui · error · ValidationException

serde is not configured

Error message

${name} serde is not configured

What it means

Built-in serdes can auto-configure from cluster properties; if the serde entry supplies neither explicit properties nor supports auto-configuration, createSerdeWithBuiltInSerdeName throws ValidationException('<name> serde is not configured') because the serde cannot be initialized without settings.

Solutions

  1. Provide the required properties for the serde under kafka.clusters.<n>.serde.<i>.properties (e.g. schema registry URL)
  2. Add the corresponding cluster-level settings the serde's auto-configuration looks for
  3. Remove the serde entry if it is not needed for that cluster

Example fix

// before
serde:
  - name: avro-schema-registry   # no properties, no registry config
// after
serde:
  - name: avro-schema-registry
    properties:
      schema.registry.url: http://schema-registry:8081
Defensive patterns

Strategy: validation

Validate before calling

if (isBuiltInSerdeName(name)
    && (cfg.getProperties() == null || cfg.getProperties().isEmpty())
    && !builtinSupportsAutoConfigure(name))
  throw new IllegalArgumentException(name + " serde requires explicit properties");

Try / catch

try {
  serde = createSerdeFromConfig(cfg, ...);
} catch (ValidationException e) {
  log.error("Serde {} unconfigured: {}", cfg.getName(), e.getMessage());
  throw e;
}

Prevention

When it happens

Trigger: Adding a built-in serde (e.g. avro-schema-registry, protobuf) with no properties while the cluster config lacks the values its auto-configuration requires (e.g. schema registry URL).

Common situations: Enabling protobuf serde without schema-registry settings in the cluster config; auto-configure returning false because required cluster properties are absent.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of provectus/kafka-ui@83b5a60cc0 (2026-09-08). Data as JSON: /api/errors/b6b43d821ec25804. Report an issue: GitHub.

Appendix: source

Thrown at kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/SerdesInitializer.java:206

  }

  private SerdeInstance createSerdeWithBuiltInSerdeName(SerdeConfig serdeConfig,
                                                        PropertyResolver serdeProps,
                                                        PropertyResolver clusterProps,
                                                        PropertyResolver globalProps) {
    String name = serdeConfig.getName();
    if (serdeConfig.getClassName() != null) {
      throw new ValidationException("className can't be set for built-in serde");
    }
    if (serdeConfig.getFilePath() != null) {
      throw new ValidationException("filePath can't be set for built-in serde types");
    }
    var clazz = builtInSerdeClasses.get(name);
    BuiltInSerde serde = createSerdeInstance(clazz);
    if (serdeConfig.getProperties() == null || serdeConfig.getProperties().isEmpty()) {
      if (!autoConfigureSerde(serde, clusterProps, globalProps)) {
        // no properties provided and serde does not support auto-configuration
        throw new ValidationException(name + " serde is not configured");
      }
    } else {
      // configuring serde with explicitly set properties
      serde.configure(serdeProps, clusterProps, globalProps);
    }
    return new SerdeInstance(
        name,
        serde,
        nullablePattern(serdeConfig.getTopicKeysPattern()),
        nullablePattern(serdeConfig.getTopicValuesPattern()),
        null
    );
  }

  private boolean autoConfigureSerde(BuiltInSerde serde, PropertyResolver clusterProps, PropertyResolver globalProps) {
    if (serde.canBeAutoConfigured(clusterProps, globalProps)) {
      serde.autoConfigure(clusterProps, globalProps);
      return true;

View on GitHub (pinned to 83b5a60cc0)