{"record":{"id":"da80b967ab2e6fb8","repo":"kataras/iris","slug":"binder-disablestructdynamicbindings-setting-is-se","errorCode":null,"errorMessage":"binder: DisableStructDynamicBindings setting is set to true: dynamic binding found: %s","messagePattern":"binder: DisableStructDynamicBindings setting is set to true: dynamic binding found: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"hero/struct.go","lineNumber":101,"sourceCode":"\n\t// fmt.Printf(\"Service: %s, Bindings(%d):\\n\", typ, len(bindings))\n\tfor _, b := range bindings {\n\t\t// fmt.Printf(\"* \" + b.String() + \"\\n\")\n\t\tif b.Dependency.Static {\n\t\t\t// Fill now.\n\t\t\tinput, err := b.Dependency.Handle(nil, b.Input)\n\t\t\tif err != nil {\n\t\t\t\tif err == ErrSeeOther {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tpanic(err)\n\t\t\t}\n\n\t\t\telem.FieldByIndex(b.Input.StructFieldIndex).Set(input)\n\t\t} else if !b.Dependency.Static {\n\t\t\tif disableStructDynamicBindings {\n\t\t\t\tpanic(fmt.Sprintf(\"binder: DisableStructDynamicBindings setting is set to true: dynamic binding found: %s\", b.String()))\n\t\t\t}\n\n\t\t\tsingleton = false\n\t\t}\n\t}\n\n\tif isSingleton && !singleton {\n\t\tpanic(fmt.Sprintf(\"binder: Singleton setting is set to true but struct has dynamic bindings: %s\", typ))\n\t}\n\n\ts := &Struct{\n\t\tptrValue:    v,\n\t\tptrType:     typ,\n\t\telementType: elem.Type(),\n\t\tbindings:    bindings,\n\t\tSingleton:   singleton,\n\t}\n","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/kataras/iris/blob/7bedaf55a0b64bbb2248a5845a2c60d81a30996a/hero/struct.go#L83-L119","documentation":"When Container.DisableStructDynamicBindings is true, every field binding of a registered struct must be static (resolved once at setup). A field whose dependency is dynamic (resolved per request) is rejected with this panic, keeping the struct a singleton.","triggerScenarios":"Registering a struct with c.Struct where one field's type resolves to a per-request dependency (e.g. request payload, path parameter) while DisableStructDynamicBindings = true.","commonSituations":"Enabling the optimization setting globally but one controller struct still has a dynamic field (e.g. a request body input); adding a new request-scoped field to an existing singleton controller after enabling the setting.","solutions":["Remove or change the dynamic field to a static dependency type (a service/config registered at startup).","Set c.DisableStructDynamicBindings = false if dynamic per-request fields are intended (struct stops being a singleton).","Split the struct: keep static fields in the singleton struct and move request-scoped data into handler parameters.","Inspect b.Dependency.Static for each field binding to identify which one is dynamic."],"exampleFix":"// before\nc.DisableStructDynamicBindings = true\nc.Struct(&Controller{ /* has field Payload *UserRequest -> dynamic */ })\n// after\nc.Struct(&Controller{ Svc *UserService }) // only static fields\n// and handle request payloads via handler method parameters instead","handlingStrategy":"validation","validationCode":"// Before enabling DisableStructDynamicBindings, audit struct fields:\nfor each field binding b of target struct {\n\tif !b.Dependency.Static { panic(\"dynamic field: \" + b.String()) }\n}\nc.DisableStructDynamicBindings = true","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only enable DisableStructDynamicBindings when all controller fields are static services/config.","Keep request-scoped inputs in handler method parameters, not struct fields.","Split mixed structs into a static singleton plus per-request handler inputs."],"tags":["dependency-injection","dynamic-binding","panic","singleton"],"backgroundTag":"dynamic-binding-not-allowed","analyzedSha":"7bedaf55a0b64bbb2248a5845a2c60d81a30996a","analyzedAt":"2026-08-30T20:38:16.250Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}