{"record":{"id":"5d1f55a2d71e1528","repo":"xai-org/x-algorithm","slug":"the-value-class-config-valuethriftclass-is-not","errorCode":null,"errorMessage":"The value class ${config.valueThriftClass}, is not supported","messagePattern":"The value class (.+?), is not supported","errorType":"validation","errorClass":"ConfigFailure","httpStatus":null,"severity":"error","filePath":"botmaker/botmaker_eventbus/src/main/scala/com/twitter/botmaker/runtime/KafkaProducer.scala","lineNumber":175,"sourceCode":"  }\n}\n\ncase class KafkaProducerOperator(config: KafkaProducerConfig) {\n\n  private val ns = \"kf.\"\n  private val funcName: String = ns + config.funcName\n  implicit val timer: com.twitter.util.Timer = DefaultTimer.getInstance\n\n  def toCompile: CompilerUnit = new CompilerUnit {\n\n    private def getValueClassObjectType(valueClass: String): Type = {\n      val classObject = ClassCache.forName(valueClass)\n      if (classOf[Thrift[_, _]].isAssignableFrom(classObject)) {\n        Type.thriftOf(classObject.asInstanceOf[Class[Thrift[_, _]]])\n      } else if (classOf[String].isAssignableFrom(classObject)) {\n        Type.STRING\n      } else {\n        throw ConfigFailure(s\"The value class ${config.valueThriftClass}, is not supported\")\n      }\n    }\n\n    private val signature = new Signature(\n      ImmutableList.of[Type](Type.OBJECT, getValueClassObjectType(config.valueThriftClass)),\n      ImmutableList.of[Type](Type.LONG),\n      Type.UNIT\n    )\n\n    override def funcName: String = KafkaProducerOperator.this.funcName\n\n    override def botMakerDoc: BotMakerDoc = BotMakerDoc.of(\n      funcName,\n      signature,\n      s\"publish an event as ${config.valueThriftClass} object to kafka cluster: ${config.description}\",\n      ActionLevel.PROD_OTHER_ACTION,\n      \"key\",\n      \"value\",","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/xai-org/x-algorithm/blob/24c60942c5c5fdad3a6addffb4c6e6d2f228f04f/botmaker/botmaker_eventbus/src/main/scala/com/twitter/botmaker/runtime/KafkaProducer.scala#L157-L193","documentation":"ConfigFailure thrown from KafkaProducer's getValueClassObjectType when the configured valueThriftClass is neither a Thrift[_, _] subclass nor java String, so no Kafka Avro/schema Type can be derived for it.","triggerScenarios":"Configuring value_thrift_class to a non-Thrift, non-String class (e.g. a plain case class, protobuf class, or a class not on the runtime classpath that resolves to something unexpected).","commonSituations":"Pointing the producer at a scala case class instead of a generated Thrift class; typo in the FQCN; using a Thrift class generated by an incompatible compiler version.","solutions":["Use a fully-qualified name of a class extending com.twitter.scrooge.Thrift or java.lang.String","Verify the class is on the classpath (ClassCache.forName succeeded) and is a Thrift-generated class","If you need arbitrary payloads, wrap them in a Thrift struct"],"exampleFix":"# before\nvalue_thrift_class: \"com.acme.MyCaseClass\"\n# after\nvalue_thrift_class: \"com.acme.thriftscala.MyEvent\"  # scrooge-generated","handlingStrategy":"validation","validationCode":"val cls = ClassCache.forName(config.valueThriftClass)\nrequire(classOf[Thrift[_,_]].isAssignableFrom(cls) || cls == classOf[String])","typeGuard":null,"tryCatchPattern":"catch { case e: ConfigFailure if e.getMessage.contains(\"not supported\") => surface which class and its supertypes }","preventionTips":["Only configure scrooge-generated Thrift classes or String as values","Add a startup smoke test that builds the producer before serving traffic"],"tags":["kafka","thrift","scala","config-validation"],"backgroundTag":"unsupported-value-type","analyzedSha":"24c60942c5c5fdad3a6addffb4c6e6d2f228f04f","analyzedAt":"2026-08-28T11:40:14.686Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}