quarkusio/quarkus · error · RuntimeException

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

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.

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.

Appendix: 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)