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

At runtime, Funqy's Google Cloud Functions binding resolves the configured quarkus.funqy.export value to a registered function invoker. If the configured name matches no registered function, chooseInvoker throws a RuntimeException naming the bad export value.

Source

Thrown at extensions/funqy/funqy-google-cloud-functions/runtime/src/main/java/io/quarkus/funqy/gcp/functions/FunqyCloudFunctionsBindingRecorder.java:64

                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);
            }
        }

        FunctionConstructor.CONTAINER = bc;
    }

    public void chooseInvoker() {
        // this is done at Runtime so that we can change it with an environment variable.
        if (config.getValue().export().isPresent()) {
            invoker = FunctionRecorder.registry.matchInvoker(config.getValue().export().get());
            if (invoker == null) {
                throw new RuntimeException(
                        "quarkus.funqy.export does not match a function: " + config.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();
        }
        if (invoker.hasInput()) {
            reader = (ObjectReader) invoker.getBindingContext().get(ObjectReader.class.getName());
        }
        if (invoker.hasOutput()) {
            writer = (ObjectWriter) invoker.getBindingContext().get(ObjectWriter.class.getName());
        }
    }

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set quarkus.funqy.export / FUNQY_EXPORT to the exact name of a registered @Funq method
  2. Verify the function class is included in the deployed uber-jar
  3. Remove the export setting if there is only one function

Example fix

// before (env)
FUNQY_EXPORT=myFunct
// after
FUNQY_EXPORT=myFunction
Defensive patterns

Strategy: validation

Validate before calling

// verify the export matches a @Funq method before deploy
grep -rn "@Funq" src/main/java # confirm a method named exactly as FUNQY_EXPORT

Try / catch

try {
    binding.init();
} catch (RuntimeException e) {
    log.error("Check quarkus.funqy.export / FUNQY_EXPORT value", e);
}

Prevention

When it happens

Trigger: quarkus.funqy.export (often set via the FUNQY_EXPORT env var in GCF) contains a name that is not registered — misspelled, renamed, or the class containing the @Funq method is not in the deployment.

Common situations: Typo in the FUNQY_EXPORT environment variable; renaming the funq method without updating the export; deploying a jar that lacks the function class.

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/bb97f12fbc129d8d. Report an issue: GitHub.