{"record":{"id":"a2f7ddaff62c7e64","repo":"flowable/flowable-engine","slug":"invalid-action-action","errorCode":null,"errorMessage":"Invalid action: '<action>'.","messagePattern":"Invalid action: '<action>'\\.","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-app-engine-rest/src/main/java/org/flowable/app/rest/service/api/repository/AppDefinitionResource.java","lineNumber":107,"sourceCode":"        if (appDefinition == null) {\n            throw new FlowableObjectNotFoundException(\"Could not find an app definition with id '\" + appDefinitionId + \"'.\", AppDefinition.class);\n        }\n        \n        if (restApiInterceptor != null) {\n            restApiInterceptor.accessAppDefinitionInfoById(appDefinition);\n        }\n\n        if (actionRequest.getCategory() != null) {\n            // Update of category required\n            appRepositoryService.setAppDefinitionCategory(appDefinition.getId(), actionRequest.getCategory());\n\n            // No need to re-fetch the AppDefinition entity, just update category in response\n            AppDefinitionResponse response = appRestResponseFactory.createAppDefinitionResponse(appDefinition);\n            response.setCategory(actionRequest.getCategory());\n            return response;\n        }\n        \n        throw new FlowableIllegalArgumentException(\"Invalid action: '\" + actionRequest.getAction() + \"'.\");\n    }\n}\n","sourceCodeStart":89,"sourceCodeEnd":110,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-app-engine-rest/src/main/java/org/flowable/app/rest/service/api/repository/AppDefinitionResource.java#L89-L110","documentation":"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.","triggerScenarios":"Calling taskNameLike(\"Repo%\") and taskNameInIgnoreCase(...) on the same HistoricTaskInstanceQuery, in either order.","commonSituations":"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.","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."],"exampleFix":"// before\nquery.taskNameLike(\"Report%\");\nquery.taskNameInIgnoreCase(List.of(\"Report A\")); // throws\n\n// after\nquery.taskNameInIgnoreCase(List.of(\"Report A\", \"Report B\"));","handlingStrategy":"validation","validationCode":"if (query.getTaskNameLike() != null) {\n    throw new IllegalStateException(\"Choose either taskNameLike or taskNameInIgnoreCase\");\n}\nquery.taskNameInIgnoreCase(names);","typeGuard":null,"tryCatchPattern":"try {\n    query.taskNameInIgnoreCase(names);\n} catch (FlowableIllegalArgumentException e) {\n    LOG.error(\"Name filter conflict: {}\", e.getMessage());\n    throw e;\n}","preventionTips":["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"],"tags":["flowable","query-builder","illegal-argument","mutually-exclusive-filters"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}