{"record":{"id":"2f2fbecd2819ed75","repo":"quarkusio/quarkus","slug":"a-generated-bean-does-not-declare-the-delegate-fie","errorCode":null,"errorMessage":"A generated bean does not declare the delegate field: ${generatedBean}","messagePattern":"A generated bean does not declare the delegate field: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java","lineNumber":130,"sourceCode":"\n    @BuildStep\n    void processGeneratedBeans(CombinedIndexBuildItem index, BuildProducer<AnnotationsTransformerBuildItem> transformers,\n            BuildProducer<BindableServiceBuildItem> bindables,\n            BuildProducer<DelegatingGrpcBeanBuildItem> delegatingBeans) {\n\n        // generated bean class -> blocking methods\n        Map<DotName, Set<String>> generatedBeans = new HashMap<>();\n        // generated bean class -> virtual methods\n        Map<DotName, Set<String>> virtuals = new HashMap<>();\n        String[] excludedPackages = { \"grpc.health.v1\", \"io.grpc.reflection\" };\n\n        // We need to transform the generated bean and register a bindable service if:\n        // 1. there is a user-defined bean that implements the generated interface (injected delegate)\n        // 2. there is no user-defined bean that extends the relevant impl bases (both mutiny and regular)\n        for (ClassInfo generatedBean : index.getIndex().getKnownDirectImplementors(GrpcDotNames.MUTINY_BEAN)) {\n            FieldInfo delegateField = generatedBean.field(\"delegate\");\n            if (delegateField == null) {\n                throw new IllegalStateException(\"A generated bean does not declare the delegate field: \" + generatedBean);\n            }\n            DotName serviceInterface = delegateField.type().name();\n            Collection<ClassInfo> serviceCandidates = index.getIndex().getAllKnownImplementors(serviceInterface);\n            if (serviceCandidates.isEmpty()) {\n                // No user-defined bean that implements the generated interface\n                continue;\n            }\n            ClassInfo userDefinedBean = null;\n            for (ClassInfo candidate : serviceCandidates) {\n                // The bean must be annotated with @GrpcService\n                if (candidate.declaredAnnotation(GrpcDotNames.GRPC_SERVICE) != null) {\n                    userDefinedBean = candidate;\n                    break;\n                }\n            }\n            if (userDefinedBean == null) {\n                continue;\n            }","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java#L112-L148","documentation":"Quarkus inspects generated beans implementing MutinyBean to find their 'delegate' field, which reveals the gRPC service interface. A generated bean without a delegate field indicates corrupted/outdated generated code or a version mismatch between the stub generator and Quarkus, so deployment fails defensively.","triggerScenarios":"A class implementing io.quarkus.grpc.runtime.MutinyBean (or the MutinyBean dot name) is indexed but declares no field named 'delegate' during processGeneratedBeans.","commonSituations":"Stale target/classes from an older Quarkus version; hand-written class implementing MutinyBean; mismatch between grpc codegen plugin version and Quarkus version; incremental build corruption.","solutions":["Run a clean build: ./mvnw clean install","Regenerate stubs with a gRPC codegen version matching your Quarkus version","Remove hand-written classes implementing MutinyBean — let Quarkus generate them","Check the generated bean class under target/generated-sources for the delegate field"],"exampleFix":"// before (hand-written)\nclass GreeterBean implements MutinyBean<Greeter> { ... }\n\n// after: delete the class and rely on Quarkus-generated GreeterBean","handlingStrategy":"validation","validationCode":"# before building, regenerate everything cleanly\n./mvnw clean install -DskipTests && ls target/generated-sources/protobuf/","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never implement MutinyBean yourself — it is generated","Run clean builds after upgrading Quarkus or the protobuf plugin","Inspect target/generated-sources to confirm delegate field exists"],"tags":["grpc","codegen","stale-build"],"backgroundTag":"stale-generated-code","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}