quarkusio/quarkus · error · RuntimeException
There are no functions to process lambda
Error message
There are no functions to process lambda
What it means
Funqy Amazon Lambda dispatches incoming invocations to a chosen function invoker. If no quarkus.funqy.export is set and the registry contains zero functions, there is nothing to dispatch to, so this RuntimeException is thrown at runtime init.
Solutions
- Add @Funq-annotated function methods to the application
- Ensure the module containing the functions is included in the deployed artifact
- Verify the Lambda is pointed at the correct JAR/native binary build output
- If the app intentionally has no functions, remove the funqy-amazon-lambda binding dependency
Example fix
// before
class Functions { }
// after
class Functions {
@Funq
public String hello(String name) { return "hello " + name; }
} Defensive patterns
Strategy: validation
Validate before calling
long count = Arrays.stream(Functions.class.getDeclaredMethods())
.filter(m -> m.isAnnotationPresent(Funq.class)).count();
if (count == 0) throw new IllegalStateException("No @Funq functions found; Lambda has nothing to invoke"); Prevention
- Ensure at least one @Funq method exists in the deployed artifact
- Verify the Lambda points at the right build output
- Include the module containing functions in the deployment package
When it happens
Trigger: The Lambda runtime starts with no @Funq-annotated functions registered in FunctionRecorder.registry and no quarkus.funqy.export configured.
Common situations: Deployed a Lambda artifact whose code has no @Funq methods; functions in a module not included in the build; wrong artifact deployed to Lambda; dependency providing Funqy binding but no function beans.
Related errors
- quarkus.funqy.export does not match a function
- Could not deserialize the provided message.
- Could not serialize the provided output.
- DynamoDB records are too specific. It is not supported to…
- DynamoDB records are too specific. It is not supported to…
AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05).
Data as JSON: /api/errors/5b65e7e375d3ff8d.
Report an issue: GitHub.
Appendix: source
Thrown at extensions/funqy/funqy-amazon-lambda/runtime/src/main/java/io/quarkus/funqy/lambda/FunqyLambdaBindingRecorder.java:95
}
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.
JsonMapper jsonMapper = AmazonLambdaMapperRecorder.objectMapper;
JsonMapper.Builder builder = jsonMapper.rebuild();
reader = new AwsEventInputReader(builder, objectReader, amazonBuildTimeConfig);
} else {View on GitHub (pinned to e1c734241f)