{"record":{"id":"4c3c85ea53fe37e1","repo":"quarkusio/quarkus","slug":"quarkus-funqy-export-value-does-not-map-a-function","errorCode":null,"errorMessage":"quarkus.funqy.export value does not map a function: ${export}","messagePattern":"quarkus\\.funqy\\.export value does not map a function: (.+?)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"extensions/funqy/funqy-knative-events/runtime/src/main/java/io/quarkus/funqy/runtime/bindings/knative/events/KnativeEventsBindingRecorder.java","lineNumber":210,"sourceCode":"\n        shutdown.addShutdownTask(new Runnable() {\n            @Override\n            public void run() {\n                FunctionConstructor.CONTAINER = null;\n                objectMapper = null;\n                typeTriggers = null;\n            }\n        });\n\n        FunctionConstructor.CONTAINER = beanContainer;\n\n        // This needs to happen in start at RUNTIME so that\n        // mappings can be overridden by environment variables\n        FunctionInvoker defaultInvoker = null;\n        if (runtimeConfig.getValue().export().isPresent()) {\n            defaultInvoker = FunctionRecorder.registry.matchInvoker(runtimeConfig.getValue().export().get());\n            if (defaultInvoker == null) {\n                throw new RuntimeException(\n                        \"quarkus.funqy.export value does not map a function: \" + runtimeConfig.getValue().export().get());\n            }\n\n        }\n\n        if (eventsRuntimeConfig.getValue().mapping() != null) {\n            for (Map.Entry<String, FunqyKnativeEventsConfig.FunctionMapping> entry : eventsRuntimeConfig.getValue().mapping()\n                    .entrySet()) {\n                String functionName = entry.getKey();\n                FunctionInvoker invoker = FunctionRecorder.registry.matchInvoker(functionName);\n                if (invoker == null) {\n                    throw new RuntimeException(\"knative-events.function-mapping does not map to a function: \" + functionName);\n                }\n                FunqyKnativeEventsConfig.FunctionMapping mapping = entry.getValue();\n                if (mapping.trigger().isPresent()) {\n                    typeTriggers.compute(mapping.trigger().get(), (k, v) -> {\n                        if (v == null) {\n                            v = new ArrayList<>();","sourceCodeStart":192,"sourceCodeEnd":228,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/funqy/funqy-knative-events/runtime/src/main/java/io/quarkus/funqy/runtime/bindings/knative/events/KnativeEventsBindingRecorder.java#L192-L228","documentation":"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.","triggerScenarios":"Setting quarkus.funqy.export=<name> where <name> matches no @Function-annotated method name registered in FunctionRecorder.registry; evaluated in start() so application startup fails.","commonSituations":"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.","solutions":["Set quarkus.funqy.export to the exact name of an existing Funqy function (the method name or the name given in @Function).","Remove the quarkus.funqy.export property if only one function exists and default selection is fine.","List registered functions (function names from @Function annotations) and fix the mismatch.","Update the Knative env var / application.properties after renaming the function."],"exampleFix":"// before\nquarkus.funqy.export=myFunction\n// after (function declared as @Function public void processOrder(...))\nquarkus.funqy.export=processOrder","handlingStrategy":"validation","validationCode":"String export = config.getOptionalValue(\"quarkus.funqy.export\", String.class).orElse(null);\nif (export != null && !registeredFunctionNames.contains(export)) {\n    throw new IllegalArgumentException(\"quarkus.funqy.export does not map a function: \" + export);\n}","typeGuard":"boolean exportIsValid(String export, Set<String> knownFunctions) {\n    return export == null || knownFunctions.contains(export);\n}","tryCatchPattern":"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; }","preventionTips":["Keep quarkus.funqy.export in sync with @Function method names","Verify env-var overrides (FUNQY_EXPORT / QUARKUS_FUNQY_EXPORT) in Knative deployments after renames","Omit the property when there is only one function","Smoke-test startup locally before pushing the container"],"tags":["knative","config","funqy","startup-failure","function-export"],"backgroundTag":"invalid-config-value","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}