quarkusio/quarkus · error · CreationException
Creation logic not implemented
Error message
Creation logic not implemented
What it means
BeanCreator's deprecated default create(CreationalContext, Map<String,Object>) is a placeholder that throws CreationException('Creation logic not implemented') unless overridden. It exists only for backward compatibility with pre-3.0 custom bean implementations; since 3.0 the framework calls create(SyntheticCreationalContext) instead.
Source
Thrown at independent-projects/arc/runtime/src/main/java/io/quarkus/arc/BeanCreator.java:36
/**
*
* @param context
* @return the contextual instance
*/
default T create(SyntheticCreationalContext<T> context) {
return create(context, context.getParams());
}
/**
*
* @param creationalContext
* @param params
* @return the contextual instance
* @deprecated Use {@link #create(SyntheticCreationalContext)} instead
*/
@Deprecated(forRemoval = true, since = "3.0")
default T create(CreationalContext<T> creationalContext, Map<String, Object> params) {
throw new CreationException("Creation logic not implemented");
}
}
View on GitHub (pinned to e1c734241f)
Solutions
- Override create(SyntheticCreationalContext<T>) in your BeanCreator and move the instantiation logic there.
- Remove the deprecated create(CreationalContext, Map) override entirely; params should be carried via SyntheticCreationalContext.getParams().
- If a third-party library provides the creator, upgrade it to a Quarkus 3.x-compatible version.
Example fix
// before
public class MyCreator implements BeanCreator<Foo> {
// no create() implemented -> default throws
}
// after
public class MyCreator implements BeanCreator<Foo> {
@Override
public Foo create(SyntheticCreationalContext<Foo> ctx) {
return new Foo(ctx.getParams().get("name"));
}
} Defensive patterns
Strategy: validation
Validate before calling
if (!(creator instanceof MyCreator impl) || !overridesCreate(impl.getClass())) {
throw new IllegalStateException("BeanCreator must override create(SyntheticCreationalContext)");
} Type guard
static <T> boolean hasCreationLogic(BeanCreator<T> c) {
try {
return BeanCreator.class.getMethod("create", SyntheticCreationalContext.class)
.getDeclaringClass() != BeanCreator.class
|| c.getClass().getDeclaredMethods().length > 0;
} catch (NoSuchMethodException e) { return false; }
} Try / catch
try {
T instance = creator.create(ctx);
} catch (CreationException e) {
throw new IllegalStateException("BeanCreator " + creator.getClass() + " has no creation logic (Quarkus 3.x requires create(SyntheticCreationalContext))", e);
} Prevention
- After upgrading to Quarkus 3+, always implement create(SyntheticCreationalContext) and delete the deprecated two-arg create.
- Pass creator params via SyntheticCreationalContext.getParams(), not the old Map parameter.
- Write a smoke test that instantiates every custom synthetic bean at startup.
When it happens
Trigger: A custom BeanCreator implementation relies on the deprecated @Deprecated(forRemoval=true, since="3.0") default method without overriding either create overload with real logic, and the container invokes it during instance creation.
Common situations: Upgrading from Quarkus 2.x to 3.x where the old callback signature stopped being called; implementing the interface but leaving the body to the default; copy-pasting a stub creator without filling in instantiation code.
Related errors
- The cause of an inactive result must also be inactive
- AnnotationTransformation is not an AnnotationsTransformer: <
- Quarkus does not support CDI Full @Specializes annotation; t
- IllegalStateException wrapping ClassNotFoundException for ge
- Unable to derive the logger name at ${injectionPoint}
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/544f6199b5b98727.
Report an issue: GitHub.