flowable/flowable-engine · error · FlowableException

No resource name available

Error message

No resource name available

What it means

Thrown by HistoricTaskInstanceQuery.taskAssigneeIds(Collection) when the assignee collection is null. The method builds a multi-assignee IN predicate and requires a concrete list of assignee identifiers. The null check is the first of several validations on the argument.

Source

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

    @ApiOperation(value = "Get an app definition resource content", nickname = "getAppDefinitionContent", tags = { "App Definitions" })
    @ApiResponses(value = {
            @ApiResponse(code = 200, message = "Indicates both app definition and resource have been found and the resource data has been returned."),
            @ApiResponse(code = 404, message = "Indicates the requested app definition was not found or there is no resource with the given id present in the app definition. The status-description contains additional information.")
    })
    @GetMapping(value = "/app-repository/app-definitions/{appDefinitionId}/resourcedata", produces = "application/json")
    @ResponseBody
    public byte[] getAppDefinitionResource(@ApiParam(name = "appDefinitionId") @PathVariable String appDefinitionId, HttpServletResponse response) {
        AppDefinition appDefinition = appRepositoryService.getAppDefinition(appDefinitionId);

        if (appDefinition == null) {
            throw new FlowableObjectNotFoundException("Could not find an app definition with id '" + appDefinitionId);
        }
        if (appDefinition.getDeploymentId() == null) {
            throw new FlowableException("No deployment id available");
        }
        if (appDefinition.getResourceName() == null) {
            throw new FlowableException("No resource name available");
        }
        
        if (restApiInterceptor != null) {
            restApiInterceptor.accessAppDefinitionInfoById(appDefinition);
        }

        // Check if deployment exists
        AppDeployment deployment = appRepositoryService.createDeploymentQuery().deploymentId(appDefinition.getDeploymentId()).singleResult();
        if (deployment == null) {
            throw new FlowableObjectNotFoundException("Could not find a deployment with id '" + appDefinition.getDeploymentId());
        }

        List<String> resourceList = appRepositoryService.getDeploymentResourceNames(appDefinition.getDeploymentId());

        if (resourceList.contains(appDefinition.getResourceName())) {
            final InputStream resourceStream = appRepositoryService.getResourceAsStream(
                    appDefinition.getDeploymentId(), appDefinition.getResourceName());

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Null-check assigneeIds before calling and skip the filter when absent.
  2. Initialize the collection to an empty list at the source and only call taskAssigneeIds when non-empty (empty list also throws).
  3. Make the producer return Collections.emptyList() rather than null for 'no assignees'.

Example fix

// before
query.taskAssigneeIds(assignees); // may be null

// after
if (assignees != null && !assignees.isEmpty()) {
    query.taskAssigneeIds(assignees);
}
Defensive patterns

Strategy: validation

Validate before calling

if (assignees == null) { /* skip filter or return empty result */ }
else if (!assignees.isEmpty()) { query.taskAssigneeIds(assignees); }

Type guard

static boolean isNonEmpty(Collection<String> c) { return c != null && !c.isEmpty(); }

Try / catch

try {
    query.taskAssigneeIds(assignees);
} catch (FlowableIllegalArgumentException e) {
    LOG.warn("Invalid assignee filter: {}", e.getMessage());
    return Collections.emptyList();
}

Prevention

When it happens

Trigger: Calling taskAssigneeIds(null), e.g., forwarding a nullable list of user IDs from a request, session, or configuration directly into the query.

Common situations: An unassigned filter parameter (null instead of a list), a failed lookup that returns null instead of an empty list, or deserialization of a missing JSON array field.

Related errors


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