flowable/flowable-engine · error · FlowableException

Invalid http request field in plan item instance

Error message

Invalid http request field in plan item instance ${planItemInstance.getId()} in plan item ${planItemInstance.getPlanItemDefinitionId()} in case definition ${planItemInstance.getCaseDefinitionId()}

What it means

Creating the HTTP request from the CMMN http service task's configured fields failed with a non-FlowableException, which is wrapped in this FlowableException. It indicates an invalid request field configuration (URL, method, headers, body, etc.) in the plan item definition.

Solutions

  1. Inspect the cause (getCause()) for the exact invalid field, then fix the http request field configuration in the case definition
  2. Validate the request URL/fields resolve correctly at runtime (log or test the expressions)
  3. Check field names against the FlowableHttpRequest builder API; typos silently become invalid fields
  4. Redeploy the corrected case definition

Example fix

// before
<flowable:http-request field="url" value="htp://api.example.com" />
// after
<flowable:http-request field="url" value="https://api.example.com/orders" />
Defensive patterns

Strategy: try-catch

Validate before calling

try { new java.net.URI(urlExpression); } catch (e) { throw new Error('invalid http request url: ' + url); }

Try / catch

try {
  executeHttpPlanItem();
} catch (FlowableException e) {
  if (e.getMessage().startsWith('Invalid http request field')) { inspect(e.getCause()); }
  else throw e;
}

Prevention

When it happens

Trigger: DefaultCmmnHttpActivityDelegate.execute calls createRequest and the underlying builder throws (e.g. malformed URL, invalid method, bad header/field expression) for planItemInstance's httpServiceTask.

Common situations: Typo in the http request field name in case XML; expression in url/headers evaluating to null or malformed URL; missing required field; invalid characters in URL.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/http/DefaultCmmnHttpActivityDelegate.java:78

    @Override
    protected FlowableHttpClient createHttpClient() {
        HttpClientConfig config = CommandContextUtil.getCmmnEngineConfiguration().getHttpClientConfig();
        return config.determineHttpClient();
    }

    @Override
    public CompletableFuture<ExecutionData> execute(DelegatePlanItemInstance planItemInstance, AsyncTaskInvoker taskInvoker) {
        RequestData request;

        HttpServiceTask httpServiceTask = (HttpServiceTask) planItemInstance.getPlanItemDefinition();
        try {
            request = createRequest(planItemInstance, httpServiceTask.getId());

        } catch (Exception e) {
            if (e instanceof FlowableException) {
                throw (FlowableException) e;
            } else {
                throw new FlowableException(HTTP_TASK_REQUEST_FIELD_INVALID + " in plan item instance " + planItemInstance.getId() + " in plan item "
                        + planItemInstance.getPlanItemDefinitionId() + " in case definition " + planItemInstance.getCaseDefinitionId(), e);
            }
        }

        CmmnEngineConfiguration cmmnEngineConfiguration = CommandContextUtil.getCmmnEngineConfiguration();
        HttpRequestHandler httpRequestHandler = createHttpRequestHandler(httpServiceTask.getHttpRequestHandler(), cmmnEngineConfiguration);

        if (httpRequestHandler != null) {
            httpRequestHandler.handleHttpRequest(planItemInstance, request.getHttpRequest(), null);
        }

        // Validate request
        validateRequest(request.getHttpRequest());

        boolean parallelInSameTransaction;
        if (httpServiceTask.getParallelInSameTransaction() != null) {
            parallelInSameTransaction = httpServiceTask.getParallelInSameTransaction();
        } else {

View on GitHub (pinned to d6d39ce1c6)