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

  1. Override create(SyntheticCreationalContext<T>) in your BeanCreator and move the instantiation logic there.
  2. Remove the deprecated create(CreationalContext, Map) override entirely; params should be carried via SyntheticCreationalContext.getParams().
  3. 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

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


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