{"record":{"id":"9b97d90dd1d4cfdf","repo":"provectus/kafka-ui","slug":"neither-default-not-per-topic-descriptors-defined","errorCode":null,"errorMessage":"Neither default, not per-topic descriptors defined for ${name()} serde","messagePattern":"Neither default, not per-topic descriptors defined for (.+?) serde","errorType":"validation","errorClass":"ValidationException","httpStatus":null,"severity":"error","filePath":"kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ProtobufFileSerde.java","lineNumber":111,"sourceCode":"  public void autoConfigure(PropertyResolver kafkaClusterProperties,\n                            PropertyResolver globalProperties) {\n    configure(Configuration.create(kafkaClusterProperties));\n  }\n\n  @Override\n  public void configure(PropertyResolver serdeProperties,\n                        PropertyResolver kafkaClusterProperties,\n                        PropertyResolver globalProperties) {\n    configure(Configuration.create(serdeProperties));\n  }\n\n  @VisibleForTesting\n  void configure(Configuration configuration) {\n    if (configuration.defaultMessageDescriptor() == null\n        && configuration.defaultKeyMessageDescriptor() == null\n        && configuration.messageDescriptorMap().isEmpty()\n        && configuration.keyMessageDescriptorMap().isEmpty()) {\n      throw new ValidationException(\"Neither default, not per-topic descriptors defined for \" + name() + \" serde\");\n    }\n    this.defaultMessageDescriptor = configuration.defaultMessageDescriptor();\n    this.defaultKeyMessageDescriptor = configuration.defaultKeyMessageDescriptor();\n    this.descriptorPaths = configuration.descriptorPaths();\n    this.messageDescriptorMap = configuration.messageDescriptorMap();\n    this.keyMessageDescriptorMap = configuration.keyMessageDescriptorMap();\n  }\n\n  @Override\n  public Optional<String> getDescription() {\n    return Optional.empty();\n  }\n\n  private Optional<Descriptor> descriptorFor(String topic, Target type) {\n    return type == Target.KEY\n        ?\n        Optional.ofNullable(keyMessageDescriptorMap.get(topic))\n            .or(() -> Optional.ofNullable(defaultKeyMessageDescriptor))","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/provectus/kafka-ui/blob/83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7/kafka-ui-api/src/main/java/com/provectus/kafka/ui/serdes/builtin/ProtobufFileSerde.java#L93-L129","documentation":"ProtobufFileSerde requires at least one protobuf descriptor source: a default message descriptor, a default key descriptor, or per-topic descriptor maps. ProtobufFileSerde.configure throws ValidationException when the Configuration has none of these, since the serde would have no way to decode messages.","triggerScenarios":"configure(configuration) called (directly or via autoConfigure) with defaultMessageDescriptor, defaultKeyMessageDescriptor, messageDescriptorMap and keyMessageDescriptorMap all null/empty.","commonSituations":"Enabling the protobuf-file serde without providing descriptor paths or message names in cluster serde properties; a typo making all descriptor properties fail to resolve; empty per-topic map entries.","solutions":["Provide descriptorPaths plus a default message name, or per-topic message descriptor entries in the serde configuration","Check property key spelling in application.yaml (e.g. protobufFileSerde.descriptorPaths, defaultMessageDescriptor)","If only key or value needs protobuf decoding, set at least the relevant descriptor map"],"exampleFix":"// before\nserde:\n  protobufFileSerde: {}\n// after\nserde:\n  protobufFileSerde:\n    descriptorPaths: /etc/kafka-ui/proto/messages.proto\n    defaultMessageDescriptor: MyMessage","handlingStrategy":"validation","validationCode":"boolean hasDescriptors = defaultMsg != null || defaultKeyMsg != null || (msgMap != null && !msgMap.isEmpty()) || (keyMap != null && !keyMap.isEmpty()); if (!hasDescriptors) throw new IllegalArgumentException(\"protobufFileSerde needs at least one descriptor\");","typeGuard":"boolean protobufConfigUsable(Configuration c) { return c.defaultMessageDescriptor() != null || c.defaultKeyMessageDescriptor() != null || !c.messageDescriptorMap().isEmpty() || !c.keyMessageDescriptorMap().isEmpty(); }","tryCatchPattern":"try { serde.autoConfigure(props); } catch (ValidationException e) { log.error(\"protobuf serde misconfigured: {}\", e.getMessage()); }","preventionTips":["Always set descriptorPaths plus a default or per-topic message name","Dry-run serde config in a dev cluster first","Validate YAML keys against documented protobufFileSerde properties"],"tags":["protobuf","configuration","serde"],"backgroundTag":"missing-required-config-field","analyzedSha":"83b5a60cc08501b570a0c4d0b4cdfceb1b88d6b7","analyzedAt":"2026-09-08T04:35:39.002Z","contentChangedAt":"2026-09-08T04:35:39.002Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}