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
- Drop the taskNameLike call and use only taskNameInIgnoreCase.
- Convert the LIKE pattern's candidate values into explicit entries of the IN list if the set is small and known.
- 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
- Model pattern-search and list-search as mutually exclusive UI/API options
- Build queries through a single filter-assembly component that enforces exclusivity
- Review copied query templates for leftover taskNameLike settings
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
- baseUrl can not be null
- Could not find an app definition with id '<appDefinitionId>'
- Could not find an app definition with id '<appDefinitionId>
- Cannot combine onlyExternalWorkers() with onlyMessages() in
- Cannot combine onlyMessages() with onlyExternalWorkers() in
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/a2f7ddaff62c7e64.
Report an issue: GitHub.