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

  1. Strip null entries before calling: names.stream().filter(Objects::nonNull).collect(toList()).
  2. Validate the collection contents up front and reject the request with a clear message if nulls are present.
  3. 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

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


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