quarkusio/quarkus · error · RuntimeException

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

Error message

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

What it means

Funqy Amazon Lambda must know which registered function to bind to the Lambda handler. When quarkus.funqy.export is set at runtime, the registry looks up a matching invoker; if the name matches no function, this RuntimeException is thrown.

Source

Thrown at extensions/funqy/funqy-amazon-lambda/runtime/src/main/java/io/quarkus/funqy/lambda/FunqyLambdaBindingRecorder.java:91

            if (invoker.hasInput()) {
                JavaType javaInputType = objectMapper.constructType(invoker.getInputType());
                ObjectReader reader = objectMapper.readerFor(javaInputType);
                invoker.getBindingContext().put(ObjectReader.class.getName(), reader);
            }
            if (invoker.hasOutput()) {
                JavaType javaOutputType = objectMapper.constructType(invoker.getOutputType());
                ObjectWriter writer = objectMapper.writerFor(javaOutputType);
                invoker.getBindingContext().put(ObjectWriter.class.getName(), writer);
            }
        }
    }

    public void chooseInvoker() {
        // this is done at Runtime so that we can change it with an environment variable.
        if (runtimeConfig.getValue().export().isPresent()) {
            invoker = FunctionRecorder.registry.matchInvoker(runtimeConfig.getValue().export().get());
            if (invoker == null) {
                throw new RuntimeException(
                        "quarkus.funqy.export does not match a function: " + runtimeConfig.getValue().export().get());
            }
        } else if (FunctionRecorder.registry.invokers().size() == 0) {
            throw new RuntimeException("There are no functions to process lambda");

        } else if (FunctionRecorder.registry.invokers().size() > 1) {
            throw new RuntimeException("Too many functions.  You need to set quarkus.funqy.export");
        } else {
            invoker = FunctionRecorder.registry.invokers().iterator().next();
        }

        ObjectReader objectReader = null;
        if (invoker.hasInput()) {
            objectReader = (ObjectReader) invoker.getBindingContext().get(ObjectReader.class.getName());

            if (amazonBuildTimeConfig.advancedEventHandling().enabled()) {
                // We create a copy, because the mapper will be reconfigured for the advanced event handling,
                // and we do not want to adjust the ObjectMapper, which is available in arc context.

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.funqy.export to the exact name of an existing @Funq function (usually the method name)
  2. List functions in the app (grep for @Funq) and align the export value
  3. Remove quarkus.funqy.export if there is only one function — it is auto-selected
  4. Rebuild/redeploy after renaming functions so the registry matches config

Example fix

// before
quarkus.funqy.export=myFuntion
// after
quarkus.funqy.export=myFunction
Defensive patterns

Strategy: validation

Validate before calling

String export = System.getenv("QUARKUS_FUNQY_EXPORT");
if (export != null && !registeredFunctionNames.contains(export)) {
    throw new IllegalStateException("quarkus.funqy.export '" + export + "' matches no function");
}

Try / catch

try {
    handler.handleRequest(input, output, context);
} catch (RuntimeException e) {
    if (e.getMessage().startsWith("quarkus.funqy.export")) log.error("Check QUARKUS_FUNQY_EXPORT value");
    throw e;
}

Prevention

When it happens

Trigger: quarkus.funqy.export is set to a value that does not equal any registered Funqy function name (function names come from method names or @Funq naming).

Common situations: Typo in the export value; renaming a function method without updating quarkus.funqy.export; export set via env var in Lambda console pointing at a removed function; case mismatch.

Related errors


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