{"record":{"id":"b7d3b285e934cabd","repo":"grpc-ecosystem/grpc-gateway","slug":"no-message-s-found","errorCode":null,"errorMessage":"no message %s found","messagePattern":"no message (.+?) found","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/descriptor/registry.go","lineNumber":789,"sourceCode":"\t\t\tservices[s.FQSN()] = struct{}{}\n\t\t\tfor _, m := range s.Methods {\n\t\t\t\tmethods[m.FQMN()] = struct{}{}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor _, opt := range opts.Method {\n\t\tqualifiedMethod := \".\" + opt.Method\n\t\tif _, ok := methods[qualifiedMethod]; !ok {\n\t\t\treturn fmt.Errorf(\"no method %s found\", opt.Method)\n\t\t}\n\t\tr.methodOptions[qualifiedMethod] = opt.Option\n\t}\n\n\tfor _, opt := range opts.Message {\n\t\tqualifiedMessage := \".\" + opt.Message\n\t\tif _, ok := r.msgs[qualifiedMessage]; !ok {\n\t\t\treturn fmt.Errorf(\"no message %s found\", opt.Message)\n\t\t}\n\t\tr.messageOptions[qualifiedMessage] = opt.Option\n\t}\n\n\tfor _, opt := range opts.Service {\n\t\tqualifiedService := \".\" + opt.Service\n\t\tif _, ok := services[qualifiedService]; !ok {\n\t\t\treturn fmt.Errorf(\"no service %s found\", opt.Service)\n\t\t}\n\t\tr.serviceOptions[qualifiedService] = opt.Option\n\t}\n\n\t// build map of all registered fields\n\tfields := make(map[string]struct{})\n\tfor _, m := range r.msgs {\n\t\tfor _, f := range m.Fields {\n\t\t\tfields[f.FQFN()] = struct{}{}\n\t\t}","sourceCodeStart":771,"sourceCodeEnd":807,"githubUrl":"https://github.com/grpc-ecosystem/grpc-gateway/blob/a58a4436a376a4bcc7d8f10c4d4f919a8438bba9/internal/descriptor/registry.go#L771-L807","documentation":"Message-level options are validated against the registry's map of loaded messages (r.msgs, keyed by fully-qualified name). An entry in opts.Message whose qualified name is absent produces this error, preventing silent no-op option application.","triggerScenarios":"Registering options with opts.Message naming a message that is not defined in any loaded file, is misspelled, or lacks its package prefix (lookup is done with '.' + opt.Message against FQMN keys).","commonSituations":"Message moved/renamed during a refactor; referencing a message from an unloaded dependency; forgetting the proto package prefix; typos in nested message paths.","solutions":["Use the fully-qualified message name including its proto package (pkg.Outer.Inner)","Confirm the message exists in a file loaded into this registry","Update the options config after renames/deletions","Dump the registry's known messages and compare with your options entries"],"exampleFix":"// before\nMessage: \"GreetingRequest\"\n// after\nMessage: \"examples.library.v1.GreetingRequest\"","handlingStrategy":"validation","validationCode":"want := \".\" + opt.Message\nif !knownMessages[want] {\n    return fmt.Errorf(\"message %q not found; use fully-qualified pkg.Message\", opt.Message)\n}\nerr = reg.RegisterOptions(opts)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Reference messages with their full package path in options entries","Regenerate/validate the options file whenever proto schemas change","Maintain a CI check that every options target resolves against current descriptors"],"tags":["configuration","protobuf","options"],"backgroundTag":"unknown-symbol-reference","analyzedSha":"a58a4436a376a4bcc7d8f10c4d4f919a8438bba9","analyzedAt":"2026-09-02T10:28:31.537Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T16:17:10.729Z"}