{"record":{"id":"7d08352a026cc2f5","repo":"apache/pulsar","slug":"schema-definition-must-specify-pojo-class-or-schem","errorCode":null,"errorMessage":"Schema definition must specify pojo class or schema json definition","messagePattern":"Schema definition must specify pojo class or schema json definition","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/util/SchemaUtil.java","lineNumber":95,"sourceCode":"            try {\n                Field validateDefaultsField = Schema.class.getDeclaredField(\"VALIDATE_DEFAULTS\");\n                validateDefaultsField.setAccessible(true);\n                validateDefaults = (ThreadLocal<Boolean>) validateDefaultsField.get(null);\n            } catch (NoSuchFieldException | IllegalAccessException e) {\n                throw new RuntimeException(\"Cannot disable validation of default values\", e);\n            }\n\n            final boolean savedValidateDefaults = validateDefaults.get();\n\n            try {\n                // Disable validation of default values for compatibility\n                validateDefaults.set(false);\n                return extractAvroSchema(schemaDefinition, pojo);\n            } finally {\n                validateDefaults.set(savedValidateDefaults);\n            }\n        } else {\n            throw new RuntimeException(\"Schema definition must specify pojo class or schema json definition\");\n        }\n    }\n\n    public static Schema extractAvroSchema(SchemaDefinition schemaDefinition, Class pojo) {\n        try {\n            return parseAvroSchema(pojo.getDeclaredField(\"SCHEMA$\").get(null).toString());\n        } catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException ignored) {\n            ReflectData reflectData = schemaDefinition.getAlwaysAllowNull()\n                     ? new ReflectData.AllowNull()\n                     : new ReflectData();\n            AvroSchema.addLogicalTypeConversions(reflectData, schemaDefinition.isJsr310ConversionEnabled(), false);\n            try {\n                return reflectData.getSchema(pojo);\n            } catch (RuntimeException e) {\n                throw new SchemaSerializationException(\n                        \"Unable to create Avro schema for class \" + pojo.getName(), e);\n            }\n        }","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/util/SchemaUtil.java#L77-L113","documentation":"createAvroSchema requires its schemaDefinition to carry either a pojo class or an explicit Avro JSON schema definition. If neither is present there is nothing to derive the schema from, so a RuntimeException is thrown. This indicates the SchemaDefinition builder was used without setting the underlying schema source.","triggerScenarios":"Building a SchemaDefinition without calling pojo(...) or schemaDefinitionBuilder with schema json: e.g. SchemaDefinition.builder().build() passed to createAvroSchema / parseSchemaInfo.","commonSituations":"Custom schema-building code that builds SchemaDefinition programmatically but forgets .withPojo(clazz); refactors that dropped the pojo argument; copying builder code and omitting the schema json.","solutions":["Set the pojo: SchemaDefinition.<T>builder().withPojo(MyPojo.class).build().","Alternatively supply the schema JSON definition string in the SchemaDefinition builder.","If constructing SchemaDefinition manually, verify the pojo/schemaJson field is non-null before passing it on."],"exampleFix":"// before\nSchemaDefinition<MyPojo> def = SchemaDefinition.<MyPojo>builder().build();\nSchema schema = Schema.AVRO(def);\n// after\nSchemaDefinition<MyPojo> def = SchemaDefinition.<MyPojo>builder().withPojo(MyPojo.class).build();\nSchema schema = Schema.AVRO(def);","handlingStrategy":"validation","validationCode":"if (schemaDefinition.getPojo() == null && schemaDefinition.getSchemaDefinition() == null) {\n    throw new IllegalArgumentException(\"SchemaDefinition needs pojo or schema json\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    Schema<T> s = Schema.AVRO(definition);\n} catch (RuntimeException e) {\n    if (e.getMessage().contains(\"must specify pojo class\")) {\n        definition = SchemaDefinition.<T>builder().withPojo(pojoClass).build();\n    }\n}","preventionTips":["Always call withPojo(...) or the schema json setter on SchemaDefinition.builder()","Add a unit test that builds each schema at startup","Avoid hand-rolling SchemaDefinition; use Schema.AVRO(Class) directly"],"tags":["avro","schema","invalid-config"],"backgroundTag":"missing-schema-definition","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}