quarkusio/quarkus · error · RuntimeException

All parameters have already been loaded, it is too late to c

Error message

All parameters have already been loaded, it is too late to call loadObjectInstance

What it means

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.

Source

Thrown at core/deployment/src/main/java/io/quarkus/deployment/recording/BytecodeRecorderImpl.java:596

                throw new RuntimeException("unknown type " + set);
            }

        }
        context.close();
        mainMethod.returnValue(null);
        var createArray = file.getMethodCreator(createArrayDescriptor);
        createArray.returnValue(createArray.newArray(Object.class, deferredParameterCount));
        file.close();

    }

    /**
     * Returns a representation of a serialized parameter.
     */
    private DeferredParameter loadObjectInstance(Object param, Map<Object, DeferredParameter> existing, Class<?> expectedType,
            boolean relaxedValidation) {
        if (loadComplete) {
            throw new RuntimeException("All parameters have already been loaded, it is too late to call loadObjectInstance");
        }
        if (existing.containsKey(param)) {
            return existing.get(param);
        }
        DeferredParameter ret = loadObjectInstanceImpl(param, existing, expectedType, relaxedValidation);
        existing.put(param, ret);
        return ret;
    }

    /**
     * Returns a representation of a serialized parameter.
     */
    private DeferredParameter loadObjectInstanceImpl(Object param, Map<Object, DeferredParameter> existing,
            Class<?> expectedType, boolean relaxedValidation) {
        //null is easy
        if (param == null) {
            return new DeferredParameter() {
                @Override

View on GitHub (pinned to e1c734241f)

Solutions

  1. Ensure all parameters are recorded before writeBytecode() runs; never record new objects from preWrite()/prepare() callbacks
  2. Move object creation out of the late phase: serialize the object eagerly when the recorder method is invoked
  3. If you control the DeferredParameter, capture needed values at construction time rather than loading them lazily
  4. Reproduce with a minimal recorder; if it occurs on released Quarkus without custom code, file a bug

Example fix

// before: loading a new object inside prepare()
void prepare(MethodContext ctx) { ctx.loadDeferred(loadObjectInstance(newValue, ...)); }
// after: register the deferred parameter during the recording phase
DeferredParameter dp = recorder.loadParam(newValue); // done before writeBytecode completes
void prepare(MethodContext ctx) { ctx.loadDeferred(dp); }
Defensive patterns

Strategy: validation

Validate before calling

// ensure all recorder invocations happen in build steps, before writeBytecode()
// never load new parameters inside DeferredParameter.prepare()/preWrite() callbacks
assert !writeBytecodeStarted : "Recording new parameters after writeBytecode() began";

Prevention

When it happens

Trigger: 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.

Common situations: Quarkus core/extension development where a LoadedBytecodeRecorder value or custom DeferredParameter recursively records new objects during prepare()/preWrite() instead of at parameter-load time.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/57f84a9f9295e1ae. Report an issue: GitHub.