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

  1. Include a "category" field in the body to update the category, or use another endpoint if you intended a different operation.
  2. Do not reuse BPMN process-definition action payloads ('activate'/'suspend') against case definitions.
  3. 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

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


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)