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

  1. Remove the named input elements from the binding if they are not real inputs.
  2. Correct the input names to match the activity type's declared inputs (check IActivityDescriber / ActivityDescriptor.Inputs).
  3. 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

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


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)