flowable/flowable-engine · error · FlowableIllegalArgumentException

Only one of eventDefinitionId or eventDefinitionKey should…

Error message

Only one of eventDefinitionId or eventDefinitionKey should be set.

What it means

REST request validation in EventInstanceCollectionResource.validateRequestParameters: both eventDefinitionId and eventDefinitionKey were supplied simultaneously; the endpoint requires exactly one, and the ambiguity is rejected.

Solutions

  1. Remove one of the two fields so exactly one is set.
  2. Null out the unused field programmatically before sending.
  3. If id is known, prefer eventDefinitionId and delete the key.
  4. Catch FlowableIllegalArgumentException and report the conflicting fields.

Example fix

// before
{ "eventDefinitionId": "42", "eventDefinitionKey": "myEvent", ... }
// after
{ "eventDefinitionKey": "myEvent", ... }
Defensive patterns

Strategy: validation

Validate before calling

int set = (req.getEventDefinitionId() != null ? 1 : 0)
        + (req.getEventDefinitionKey() != null ? 1 : 0);
if (set > 1) throw new IllegalArgumentException("Set only one of eventDefinitionId/eventDefinitionKey");

Type guard

null

Try / catch

try {
    createEventInstance(req);
} catch (FlowableIllegalArgumentException e) {
    logger.error("Conflicting event definition fields", e);
}

Prevention

When it happens

Trigger: POST body containing both eventDefinitionId and eventDefinitionKey non-null.

Common situations: Copying a request template and editing only one field; defaults merged by client frameworks; testing payloads that keep both fields populated.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/5d86d2c9495f37d2. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-event-registry-rest/src/main/java/org/flowable/eventregistry/rest/service/api/runtime/EventInstanceCollectionResource.java:127

        if (StringUtils.isNotEmpty(request.getChannelDefinitionId())) {
            channelModel = repositoryService.getChannelModelById(request.getChannelDefinitionId());
        } else if (StringUtils.isNotEmpty(request.getTenantId())) {
            channelModel = repositoryService.getChannelModelByKey(request.getChannelDefinitionKey(), request.getTenantId());
        } else {
            channelModel = repositoryService.getChannelModelByKey(request.getChannelDefinitionKey());
        }

        eventRegistry.eventReceived((InboundChannelModel) channelModel, request.getEventPayload().toString());
    }

    protected void validateRequestParameters(@RequestBody EventInstanceCreateRequest request) {
        if (request.getEventDefinitionId() == null && request.getEventDefinitionKey() == null) {
            throw new FlowableIllegalArgumentException("Either eventDefinitionId or eventDefinitionKey is required.");
        }

        int paramsSet = ((request.getEventDefinitionId() != null) ? 1 : 0) + ((request.getEventDefinitionKey() != null) ? 1 : 0);
        if (paramsSet > 1) {
            throw new FlowableIllegalArgumentException("Only one of eventDefinitionId or eventDefinitionKey should be set.");
        }

        if (request.getChannelDefinitionId() == null && request.getChannelDefinitionKey() == null) {
            throw new FlowableIllegalArgumentException("Either channelDefinitionId or channelDefinitionKey is required.");
        }

        paramsSet = ((request.getChannelDefinitionId() != null) ? 1 : 0) + ((request.getChannelDefinitionKey() != null) ? 1 : 0);
        if (paramsSet > 1) {
            throw new FlowableIllegalArgumentException("Only one of eventDefinitionId or eventDefinitionKey should be set.");
        }
    }
}

View on GitHub (pinned to d6d39ce1c6)