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
- 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
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
- 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
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
- Cannot call getValue() at deployment time
- Failed to record call to method
- String too large to record
- Unsupported wildcard type
- A matching predicate must be set!
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() {
@OverrideView on GitHub (pinned to e1c734241f)