quarkusio/quarkus · error · RuntimeException

quarkus.funqy.export value does not map a function: ${export

Error message

quarkus.funqy.export value does not map a function: ${export}

What it means

quarkus.funqy.export selects the default function by name at RUNTIME start. If the configured name does not match any registered FunctionInvoker, KnativeEventsBindingRecorder.start throws a RuntimeException naming the bad export value.

Source

Thrown at extensions/funqy/funqy-knative-events/runtime/src/main/java/io/quarkus/funqy/runtime/bindings/knative/events/KnativeEventsBindingRecorder.java:210

        shutdown.addShutdownTask(new Runnable() {
            @Override
            public void run() {
                FunctionConstructor.CONTAINER = null;
                objectMapper = null;
                typeTriggers = null;
            }
        });

        FunctionConstructor.CONTAINER = beanContainer;

        // This needs to happen in start at RUNTIME so that
        // mappings can be overridden by environment variables
        FunctionInvoker defaultInvoker = null;
        if (runtimeConfig.getValue().export().isPresent()) {
            defaultInvoker = FunctionRecorder.registry.matchInvoker(runtimeConfig.getValue().export().get());
            if (defaultInvoker == null) {
                throw new RuntimeException(
                        "quarkus.funqy.export value does not map a function: " + runtimeConfig.getValue().export().get());
            }

        }

        if (eventsRuntimeConfig.getValue().mapping() != null) {
            for (Map.Entry<String, FunqyKnativeEventsConfig.FunctionMapping> entry : eventsRuntimeConfig.getValue().mapping()
                    .entrySet()) {
                String functionName = entry.getKey();
                FunctionInvoker invoker = FunctionRecorder.registry.matchInvoker(functionName);
                if (invoker == null) {
                    throw new RuntimeException("knative-events.function-mapping does not map to a function: " + functionName);
                }
                FunqyKnativeEventsConfig.FunctionMapping mapping = entry.getValue();
                if (mapping.trigger().isPresent()) {
                    typeTriggers.compute(mapping.trigger().get(), (k, v) -> {
                        if (v == null) {
                            v = new ArrayList<>();

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.funqy.export to the exact name of an existing Funqy function (the method name or the name given in @Function).
  2. Remove the quarkus.funqy.export property if only one function exists and default selection is fine.
  3. List registered functions (function names from @Function annotations) and fix the mismatch.
  4. Update the Knative env var / application.properties after renaming the function.

Example fix

// before
quarkus.funqy.export=myFunction
// after (function declared as @Function public void processOrder(...))
quarkus.funqy.export=processOrder
Defensive patterns

Strategy: validation

Validate before calling

String export = config.getOptionalValue("quarkus.funqy.export", String.class).orElse(null);
if (export != null && !registeredFunctionNames.contains(export)) {
    throw new IllegalArgumentException("quarkus.funqy.export does not map a function: " + export);
}

Type guard

boolean exportIsValid(String export, Set<String> knownFunctions) {
    return export == null || knownFunctions.contains(export);
}

Try / catch

try { app.start(); } catch (RuntimeException e) { if (e.getMessage().contains("quarkus.funqy.export value does not map a function")) { log.error("Fix quarkus.funqy.export to match a @Function name"); } throw e; }

Prevention

When it happens

Trigger: Setting quarkus.funqy.export=<name> where <name> matches no @Function-annotated method name registered in FunctionRecorder.registry; evaluated in start() so application startup fails.

Common situations: Typo in the property value; renaming the Java method without updating the config; overriding via environment variable (FUNQY_EXPORT or quarkus.funqy.export) in Knative deployment with a stale function name; exporting a function that lives in a different artifact.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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