flowable/flowable-engine · error · FlowableIllegalArgumentException
No action found in request body.
Error message
No action found in request body.
What it means
Thrown by taskNameInIgnoreCase(Collection) when any element inside the collection is null. Every name in the IN list must be a concrete string; a null element would corrupt the generated SQL parameters. This is per-element validation of the argument collection.
Source
Thrown at modules/flowable-app-engine-rest/src/main/java/org/flowable/app/rest/service/api/repository/AppDefinitionResource.java:84
}
return appRestResponseFactory.createAppDefinitionResponse(appDefinition);
}
@ApiOperation(value = "Execute actions for an app definition", tags = { "App Definitions" },
notes = "Execute actions for an app definition (Update category)")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Indicates action has been executed for the specified app definition. (category altered)"),
@ApiResponse(code = 400, message = "Indicates no category was defined in the request body."),
@ApiResponse(code = 404, message = "Indicates the requested app definition was not found.")
})
@PutMapping(value = "/app-repository/app-definitions/{appDefinitionId}", produces = "application/json")
public AppDefinitionResponse executeAppDefinitionAction(
@ApiParam(name = "appDefinitionId") @PathVariable String appDefinitionId,
@ApiParam(required = true) @RequestBody AppDefinitionActionRequest actionRequest) {
if (actionRequest == null) {
throw new FlowableIllegalArgumentException("No action found in request body.");
}
AppDefinition appDefinition = appRepositoryService.getAppDefinition(appDefinitionId);
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);View on GitHub (pinned to d6d39ce1c6)
Solutions
- Strip null entries before calling: names.stream().filter(Objects::nonNull).collect(toList()).
- Validate the collection contents up front and reject the request with a clear message if nulls are present.
- Fix the data source so names are always populated (NOT NULL constraint, default values).
Example fix
// before
query.taskNameInIgnoreCase(names); // may contain nulls
// after
List<String> safe = names.stream().filter(Objects::nonNull).collect(Collectors.toList());
if (!safe.isEmpty()) {
query.taskNameInIgnoreCase(safe);
} Defensive patterns
Strategy: validation
Validate before calling
List<String> safe = names == null ? Collections.emptyList()
: names.stream().filter(Objects::nonNull).collect(Collectors.toList());
if (!safe.isEmpty()) { query.taskNameInIgnoreCase(safe); } Type guard
static boolean allNonNull(Collection<String> c) { return c != null && c.stream().allMatch(Objects::nonNull); } Try / catch
try {
query.taskNameInIgnoreCase(names);
} catch (FlowableIllegalArgumentException e) {
LOG.warn("Null entry in task name list: {}", e.getMessage());
throw new BadRequestException("taskNames must not contain nulls");
} Prevention
- Sanitize collections (filter Objects::nonNull) before passing to query builders
- Enforce NOT NULL / required fields at the data source producing the list
- Validate request payloads containing name lists before query construction
When it happens
Trigger: Calling taskNameInIgnoreCase(Arrays.asList("a", null)) or any list containing a null entry, commonly produced by reading sparse data (e.g., DB rows or JSON arrays with missing values) into a list.
Common situations: Populating the name list from external input or another table where some rows lack a name; using a list that was never sanitized after deserialization.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- None of the given task names can be null
- Error retrieving app engine info
- Could not find an app definition with id '<appDefinitionId>
- No deployment id available
- No resource name available
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/145cbc8f5f63f42d.
Report an issue: GitHub.