elsa-workflows/elsa-core · error · BpmnBindingException
The ' ' binding declares , which ' ' does not have.
Error message
The '{activityType}' binding declares {noun} {names}, which '{activityType}' does not have. What it means
The binding declares input(s) that the target activity type does not define. Elsa ignores unknown JSON members during deserialization, so this check at import time prevents silent loss of configuration.
Solutions
- Remove the named input elements from the binding if they are not real inputs.
- Correct the input names to match the activity type's declared inputs (check IActivityDescriber / ActivityDescriptor.Inputs).
- If the input was removed in a newer module version, update the binding to the renamed property.
Example fix
// before <elsa:binding activityType="SendEmail"> <elsa:input name="Subjekt">"Hi"</elsa:input> // typo </elsa:binding> // after <elsa:binding activityType="SendEmail"> <elsa:input name="Subject">"Hi"</elsa:input> </elsa:binding>
Defensive patterns
Strategy: validation
Validate before calling
var declared = activityDescriptor.Inputs.Select(i => i.Name).ToHashSet();
var unknown = bindingInputs.Where(i => !declared.Contains(i)).ToList();
if (unknown.Any()) throw new InvalidOperationException($"Inputs not declared on activity: {string.Join(", ", unknown)}"); Try / catch
try { await importer.ImportAsync(bpmn); }
catch (BpmnBindingException ex) when (ex.Message.Contains("does not have"))
{
logger.LogError(ex, "Binding names inputs the activity type does not declare; fix or remove them.");
} Prevention
- Source input names from the activity descriptor, not from memory
- Re-check bindings after renaming or upgrading activity types
- Diff the binding input names against the activity's descriptor when reviewing BPMN PRs
When it happens
Trigger: BpmnActivityBindingFormat.Read compares the declared input names against IActivityDescriber.GetInputProperties for the activity type and finds names not in that set (undeclaredInputNames.Count > 0).
Common situations: Misspelled input names in hand-written binding XML; stale bindings after a module rename/upgrade; copying a binding from another activity type.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- An < : > element declares no ' ', so there is nothing to…
- An < : > element of the ' ' binding declares no ' '.
- The ' ' binding declares the input ' ' more than once. Each…
- BPMN element ' ' ( ) of process ' ' carries an < : >…
- Subprocess element ' ' of process ' ' carries no…
AI-assisted analysis of elsa-workflows/elsa-core@fe9217bdfa (2026-09-13).
Data as JSON: /api/errors/8065ed36b98de3fc.
Report an issue: GitHub.
Appendix: source
Thrown at src/modules/Elsa.Bpmn.Interchange/Binding/BpmnActivityBindingFormat.cs:252
// Elsa's own JSON deserialization ignores a member the target type does not declare, so a mistyped or
// stale input name would otherwise import silently as an activity missing that configuration, with no
// diagnostic anywhere. IActivityDescriber.GetInputProperties is the same enumeration Write reads from and
// ActivityDescriptor.Inputs is built from, so a name is accepted here exactly when Write could have produced
// it.
if (seenInputNames.Count > 0)
{
var declaredInputNames = activityDescriber.GetInputProperties(activity.GetType())
.Select(property => JsonNamingPolicy.CamelCase.ConvertName(property.Name))
.ToHashSet(StringComparer.Ordinal);
var undeclaredInputNames = seenInputNames.Where(name => !declaredInputNames.Contains(name)).ToList();
if (undeclaredInputNames.Count > 0)
{
var noun = undeclaredInputNames.Count == 1 ? "an input" : "inputs";
var names = string.Join(", ", undeclaredInputNames.Select(name => $"'{name}'"));
throw new BpmnBindingException($"The '{activityType}' binding declares {noun} {names}, which '{activityType}' does not have.");
}
}
return activity;
}
private static JsonNode? Parse(string? json, string inputName, string activityType)
{
try
{
return JsonNode.Parse(json ?? "null");
}
catch (JsonException exception)
{
throw new BpmnBindingException($"Input '{inputName}' of the '{activityType}' binding does not hold valid JSON: {exception.Message}");
}
}
View on GitHub (pinned to fe9217bdfa)