flowable/flowable-engine · error · FlowableIllegalArgumentException

No deployment id provided

Error message

No deployment id provided

What it means

Thrown by getDeploymentResourceData when deploymentId is null while fetching a deployment resource's bytes. A companion check enforces a non-null resourceId too. This validation prevents ambiguous resource lookups; callers get a clear 400-level error.

Solutions

  1. Include a valid deployment id in the URL path (obtain from GET /dmn-repository/deployments)
  2. Fix URL/placeholder construction so the deploymentId segment is never empty
  3. Validate both deploymentId and resourceId client-side before calling

Example fix

// before
GET /dmn-repository/deployments//resources/model.dmn
// after
GET /dmn-repository/deployments/4f3a.../resources/model.dmn
Defensive patterns

Strategy: validation

Validate before calling

if (deploymentId == null || deploymentId.isEmpty() || resourceId == null || resourceId.isEmpty()) {
    throw new IllegalArgumentException("deploymentId and resourceId are required");
}

Type guard

boolean ready = did != null && !did.isEmpty() && rid != null && !rid.isEmpty();

Try / catch

try {
    byte[] data = client.getDeploymentResource(deploymentId, resourceId);
} catch (HttpClientErrorException e) {
    if (e.getResponseBodyAsString().contains("No deployment id provided")) {
        throw new IllegalArgumentException("deploymentId missing in URL", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: GET /dmn-repository/deployments/{deploymentId}/resources/{resourceId} where the deployment id path segment resolves to null (missing/empty placeholder).

Common situations: URL template not fully interpolated before the request; client passes only resourceId assuming it is globally unique; programmatic helper invoked with null deploymentId.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-dmn-rest/src/main/java/org/flowable/dmn/rest/service/api/repository/BaseDecisionResource.java:72

     */
    protected DmnDecision getDecisionFromRequest(String decisionId) {
        DmnDecision decision = dmnRepositoryService.getDecision(decisionId);

        if (decision == null) {
            throw new FlowableObjectNotFoundException("Could not find a decision with id '" + decisionId + "'.");
        }
        
        if (restApiInterceptor != null) {
            restApiInterceptor.accessDecisionTableInfoById(decision);
        }
        
        return decision;
    }

    protected byte[] getDeploymentResourceData(String deploymentId, String resourceId, HttpServletResponse response) {

        if (deploymentId == null) {
            throw new FlowableIllegalArgumentException("No deployment id provided");
        }
        if (resourceId == null) {
            throw new FlowableIllegalArgumentException("No resource id provided");
        }

        // Check if deployment exists
        DmnDeploymentQuery deploymentQuery = dmnRepositoryService.createDeploymentQuery().deploymentId(deploymentId);
        
        DmnDeployment deployment = deploymentQuery.singleResult();
        if (deployment == null) {
            throw new FlowableObjectNotFoundException("Could not find a deployment with id '" + deploymentId);
        }
        
        if (restApiInterceptor != null) {
            restApiInterceptor.accessDeploymentById(deployment);
        }

        List<String> resourceList = dmnRepositoryService.getDeploymentResourceNames(deploymentId);

View on GitHub (pinned to d6d39ce1c6)