flowable/flowable-engine · error · FlowableIllegalArgumentException

Invalid action: '<action>'.

Error message

Invalid action: '<action>'.

What it means

Thrown by taskNameInIgnoreCase(Collection) when a taskNameLike (SQL LIKE-style) filter is already set on the query. Exact-list matching and LIKE matching are alternative name predicates; setting both makes the query ambiguous, so the builder throws FlowableIllegalArgumentException.

Source

Thrown at modules/flowable-app-engine-rest/src/main/java/org/flowable/app/rest/service/api/repository/AppDefinitionResource.java:107

        if (appDefinition == null) {
            throw new FlowableObjectNotFoundException("Could not find an app definition with id '" + appDefinitionId + "'.", AppDefinition.class);
        }
        
        if (restApiInterceptor != null) {
            restApiInterceptor.accessAppDefinitionInfoById(appDefinition);
        }

        if (actionRequest.getCategory() != null) {
            // Update of category required
            appRepositoryService.setAppDefinitionCategory(appDefinition.getId(), actionRequest.getCategory());

            // No need to re-fetch the AppDefinition entity, just update category in response
            AppDefinitionResponse response = appRestResponseFactory.createAppDefinitionResponse(appDefinition);
            response.setCategory(actionRequest.getCategory());
            return response;
        }
        
        throw new FlowableIllegalArgumentException("Invalid action: '" + actionRequest.getAction() + "'.");
    }
}

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Drop the taskNameLike call and use only taskNameInIgnoreCase.
  2. Convert the LIKE pattern's candidate values into explicit entries of the IN list if the set is small and known.
  3. Build one predicate per query: choose pattern-search OR list-search, never both.

Example fix

// before
query.taskNameLike("Report%");
query.taskNameInIgnoreCase(List.of("Report A")); // throws

// after
query.taskNameInIgnoreCase(List.of("Report A", "Report B"));
Defensive patterns

Strategy: validation

Validate before calling

if (query.getTaskNameLike() != null) {
    throw new IllegalStateException("Choose either taskNameLike or taskNameInIgnoreCase");
}
query.taskNameInIgnoreCase(names);

Try / catch

try {
    query.taskNameInIgnoreCase(names);
} catch (FlowableIllegalArgumentException e) {
    LOG.error("Name filter conflict: {}", e.getMessage());
    throw e;
}

Prevention

When it happens

Trigger: Calling taskNameLike("Repo%") and taskNameInIgnoreCase(...) on the same HistoricTaskInstanceQuery, in either order.

Common situations: Combining a 'search by pattern' input with a 'pick from list' input without clearing the other; reusing a query object between request handlers where a previous handler set taskNameLike.

Related errors


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