{"record":{"id":"28cdf681b0ec6914","repo":"apache/beam","slug":"beam-registerschemaprovider-schema-type-provider-for-v-doesn","errorCode":null,"errorMessage":"beam.RegisterSchemaProvider: schema type provider for %v, doesn't support that type","messagePattern":"beam\\.RegisterSchemaProvider: schema type provider for (.+?), doesn't support that type","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"sdks/go/pkg/beam/schema.go","lineNumber":70,"sourceCode":"// If the supported type is an interface, that interface must have a non-empty\n// method set. That is, it cannot be the empty interface.\n//\n// RegisterSchemaProvider must be called before beam.Init(), and conventionally\n// is called in a package init() function.\nfunc RegisterSchemaProvider(rt reflect.Type, provider any) {\n\tp := provider.(SchemaProvider)\n\tswitch rt.Kind() {\n\tcase reflect.Interface:\n\t\tschema.RegisterLogicalTypeProvider(rt, p.FromLogicalType)\n\tcase reflect.Ptr:\n\t\tif rt.Elem().Kind() != reflect.Struct {\n\t\t\tpanic(fmt.Sprintf(\"beam.RegisterSchemaProvider: unsupported type kind for schema provider %v is a %v, must be interface, struct or *struct.\", rt, rt.Kind()))\n\t\t}\n\t\tfallthrough\n\tcase reflect.Struct:\n\t\tst, err := p.FromLogicalType(rt)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"beam.RegisterSchemaProvider: schema type provider for %v, doesn't support that type\", rt))\n\t\t}\n\t\tschema.RegisterLogicalType(schema.ToLogicalType(rt.Name(), rt, st))\n\tdefault:\n\t\tpanic(fmt.Sprintf(\"beam.RegisterSchemaProvider: unsupported type kind for schema provider %v is a %v, must be interface, struct or *struct.\", rt, rt.Kind()))\n\t}\n\n\tcoder.RegisterSchemaProviders(rt, p.BuildEncoder, p.BuildDecoder)\n}\n\n// RegisterSchemaProviderWithURN is for internal use only. Users are recommended to use\n// beam.RegisterSchemaProvider() instead.\n// RegisterSchemaProviderWithURN registers a new schema provider for a new logical type defined\n// in pkg/beam/model/pipeline_v1/schema.pb.go\n//\n// RegisterSchemaProviderWithURN must be called before beam.Init(), and conventionally\n// is called in a package init() function.\nfunc RegisterSchemaProviderWithURN(rt reflect.Type, provider any, urn string) {\n\tp := provider.(SchemaProvider)","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/go/pkg/beam/schema.go#L52-L88","documentation":"After kind validation, RegisterSchemaProvider calls p.FromLogicalType(rt) to obtain the storage type. If the provider itself cannot produce a schema for that type, the registration panics — the codebase treats an unusable provider as a programming error at startup rather than a recoverable failure.","triggerScenarios":"Calling beam.RegisterSchemaProvider(rt, provider) where provider's FromLogicalType(rt) returns an error, i.e. the provider does not actually support the registered type despite its kind being valid.","commonSituations":"Reusing a generic schema provider for a type it wasn't written for; registering logical types in package init() where the provider's type assumptions no longer hold after a refactor; type-name or field changes breaking the provider.","solutions":["Ensure the SchemaProvider's FromLogicalType supports exactly the type being registered (test it directly before registering).","Register each provider only for the specific struct/interface type it implements.","Check the wrapped error/logic in FromLogicalType for field/type mismatches and fix the provider implementation.","Wrap registrations in a helper that validates p.FromLogicalType(rt) succeeds before committing."],"exampleFix":"// before\nbeam.RegisterSchemaProvider(reflect.TypeOf(MyType{}), genericProvider) // FromLogicalType fails\n// after\nbeam.RegisterSchemaProvider(reflect.TypeOf(MyType{}), myTypeProvider) // supports MyType","handlingStrategy":"validation","validationCode":"p := provider.(beam.SchemaProvider)\nif _, err := p.FromLogicalType(rt); err != nil { /* provider does not support rt; fix before registering */ }","typeGuard":null,"tryCatchPattern":"defer func(){ if r := recover(); r != nil && strings.Contains(fmt.Sprint(r), \"doesn't support that type\") { /* swap in the correct provider */ } }()","preventionTips":["Register each provider only for the type it implements","Test FromLogicalType for each registered type","Keep providers in sync with schema type changes"],"tags":["go","apache-beam","schema","logical-type"],"backgroundTag":"invalid-argument-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}