flowable/flowable-engine · error · FlowableIllegalArgumentException
Invalid action: ' '.
Error message
Invalid action: '${actionRequest.getAction()}'. What it means
executeCaseDefinitionAction only handles requests carrying a category (update-category); if no category is set the request falls through to a final throw of FlowableIllegalArgumentException reporting the invalid/unsupported action string. It is thrown whenever the body parses but contains no actionable field.
Solutions
- Include a "category" field in the body to update the category, or use another endpoint if you intended a different operation.
- Do not reuse BPMN process-definition action payloads ('activate'/'suspend') against case definitions.
- Check the CaseDefinitionActionRequest fields supported by your Flowable version.
Example fix
// before
{"action":"activate"}
// after
{"action":"update-category","category":"finance"} Defensive patterns
Strategy: validation
Validate before calling
if (request.getCategory() == null) throw new IllegalArgumentException("CMMN case definition action requires a 'category' field (update-category)"); Try / catch
try { ... } catch (FlowableIllegalArgumentException e) { log.warn("Unsupported case definition action"); map to 400; } Prevention
- Don't reuse BPMN process-definition action payloads against case endpoints.
- Validate request fields against CaseDefinitionActionRequest before sending.
- Document that category is the only handled action.
When it happens
Trigger: PUT .../case-definitions/{id} with a body like {"action":"suspend"} or {"action":"activate"} — actions supported in the BPMN process REST API but not in the CMMN case REST API — or any body without a category field.
Common situations: Copy-pasting process-definition client code against the case-definition endpoint; typos in the action name; assuming action-based semantics where the CMMN API actually keys off the category field.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- A group or a user is required to create an identity link.
- A request body was expected when executing the form submit.
- An assignee is required when delegating a task.
- An assignee is required when delegating a task.
- Attachment name is required.
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/f1570d5b1a7e4de9.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/repository/CaseDefinitionResource.java:109
@ApiParam(required = true) @RequestBody CaseDefinitionActionRequest actionRequest) {
if (actionRequest == null) {
throw new FlowableIllegalArgumentException("No action found in request body.");
}
CaseDefinition caseDefinition = getCaseDefinitionFromRequest(caseDefinitionId);
if (actionRequest.getCategory() != null) {
// Update of category required
repositoryService.setCaseDefinitionCategory(caseDefinition.getId(), actionRequest.getCategory());
// No need to re-fetch the CaseDefinition entity, just update category in response
CaseDefinitionResponse response = restResponseFactory.createCaseDefinitionResponse(caseDefinition);
response.setCategory(actionRequest.getCategory());
return response;
}
throw new FlowableIllegalArgumentException("Invalid action: '" + actionRequest.getAction() + "'.");
}
@ApiOperation(value = "Get a case definition start form", tags = { "Case Definitions" })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Indicates request was successful and the case definition form is returned"),
@ApiResponse(code = 404, message = "Indicates the requested case definition was not found.")
})
@GetMapping(value = "/cmmn-repository/case-definitions/{caseDefinitionId}/start-form", produces = "application/json")
public String getProcessDefinitionStartForm(@ApiParam(name = "caseDefinitionId") @PathVariable String caseDefinitionId) {
FormEngineConfigurationApi formEngineConfiguration = (FormEngineConfigurationApi) cmmnEngineConfiguration.getEngineConfigurations().get(
EngineConfigurationConstants.KEY_FORM_ENGINE_CONFIG);
if (formEngineConfiguration == null) {
return null;
}
FormRepositoryService formRepositoryService = formEngineConfiguration.getFormRepositoryService();
if (formRepositoryService == null) {
return null;
}View on GitHub (pinned to d6d39ce1c6)