{"record":{"id":"57f84a9f9295e1ae","repo":"quarkusio/quarkus","slug":"all-parameters-have-already-been-loaded-it-is-too","errorCode":null,"errorMessage":"All parameters have already been loaded, it is too late to call loadObjectInstance","messagePattern":"All parameters have already been loaded, it is too late to call loadObjectInstance","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"core/deployment/src/main/java/io/quarkus/deployment/recording/BytecodeRecorderImpl.java","lineNumber":596,"sourceCode":"                throw new RuntimeException(\"unknown type \" + set);\n            }\n\n        }\n        context.close();\n        mainMethod.returnValue(null);\n        var createArray = file.getMethodCreator(createArrayDescriptor);\n        createArray.returnValue(createArray.newArray(Object.class, deferredParameterCount));\n        file.close();\n\n    }\n\n    /**\n     * Returns a representation of a serialized parameter.\n     */\n    private DeferredParameter loadObjectInstance(Object param, Map<Object, DeferredParameter> existing, Class<?> expectedType,\n            boolean relaxedValidation) {\n        if (loadComplete) {\n            throw new RuntimeException(\"All parameters have already been loaded, it is too late to call loadObjectInstance\");\n        }\n        if (existing.containsKey(param)) {\n            return existing.get(param);\n        }\n        DeferredParameter ret = loadObjectInstanceImpl(param, existing, expectedType, relaxedValidation);\n        existing.put(param, ret);\n        return ret;\n    }\n\n    /**\n     * Returns a representation of a serialized parameter.\n     */\n    private DeferredParameter loadObjectInstanceImpl(Object param, Map<Object, DeferredParameter> existing,\n            Class<?> expectedType, boolean relaxedValidation) {\n        //null is easy\n        if (param == null) {\n            return new DeferredParameter() {\n                @Override","sourceCodeStart":578,"sourceCodeEnd":614,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/core/deployment/src/main/java/io/quarkus/deployment/recording/BytecodeRecorderImpl.java#L578-L614","documentation":"BytecodeRecorderImpl serializes all recorded parameters during writeBytecode(); once that phase finishes, the loadComplete flag is set and the deferred-parameter array size is fixed. Calling loadObjectInstance afterwards would need a new array slot that no longer exists, so it is rejected. This is a guard against programmer error inside Quarkus itself, not usually a user-facing failure.","triggerScenarios":"Code invoked during the later instruction-emission phase (after loadComplete=true) calls back into loadObjectInstance — e.g. a lazy supplier, custom loaded-object handler, or substitution whose serialize()/callback triggers new parameter recording after writeBytecode has started writing methods.","commonSituations":"Quarkus core/extension development where a LoadedBytecodeRecorder value or custom DeferredParameter recursively records new objects during prepare()/preWrite() instead of at parameter-load time.","solutions":["Ensure all parameters are recorded before writeBytecode() runs; never record new objects from preWrite()/prepare() callbacks","Move object creation out of the late phase: serialize the object eagerly when the recorder method is invoked","If you control the DeferredParameter, capture needed values at construction time rather than loading them lazily","Reproduce with a minimal recorder; if it occurs on released Quarkus without custom code, file a bug"],"exampleFix":"// before: loading a new object inside prepare()\nvoid prepare(MethodContext ctx) { ctx.loadDeferred(loadObjectInstance(newValue, ...)); }\n// after: register the deferred parameter during the recording phase\nDeferredParameter dp = recorder.loadParam(newValue); // done before writeBytecode completes\nvoid prepare(MethodContext ctx) { ctx.loadDeferred(dp); }","handlingStrategy":"validation","validationCode":"// ensure all recorder invocations happen in build steps, before writeBytecode()\n// never load new parameters inside DeferredParameter.prepare()/preWrite() callbacks\nassert !writeBytecodeStarted : \"Recording new parameters after writeBytecode() began\";","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Record all parameters eagerly when the recorder method is invoked in a build step","Never trigger additional recording from prepare(), preWrite() or substitution callbacks","Keep custom LoadedBytecodeRecorder/DeferredParameter values registered before the write phase"],"tags":["quarkus","build-time","recorder","lifecycle"],"backgroundTag":"build-time-recording-failed","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}