flowable/flowable-engine · error · FlowableException
HTTP_TASK_REQUEST_FIELD_INVALID in execution " + execution
Error message
HTTP_TASK_REQUEST_FIELD_INVALID in execution " + execution
What it means
DefaultBpmnHttpActivityDelegate.execute wraps any non-FlowableException raised while building the HTTP request (createRequest) into this FlowableException with code HTTP_TASK_REQUEST_FIELD_INVALID. It signals that a field of the HTTP task's request (URL, method, headers, body expression) could not be resolved or was invalid for the given execution.
Source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/http/DefaultBpmnHttpActivityDelegate.java:89
@Override
protected FlowableHttpClient createHttpClient() {
HttpClientConfig config = CommandContextUtil.getProcessEngineConfiguration().getHttpClientConfig();
return config.determineHttpClient();
}
@Override
public CompletableFuture<ExecutionData> execute(DelegateExecution execution, AsyncTaskInvoker taskInvoker) {
RequestData request;
HttpServiceTask httpServiceTask = (HttpServiceTask) execution.getCurrentFlowElement();
try {
request = createRequest(execution, httpServiceTask.getId());
} catch (Exception e) {
if (e instanceof FlowableException) {
throw (FlowableException) e;
} else {
throw new FlowableException(HTTP_TASK_REQUEST_FIELD_INVALID + " in execution " + execution, e);
}
}
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
HttpRequestHandler httpRequestHandler = createHttpRequestHandler(httpServiceTask.getHttpRequestHandler(), processEngineConfiguration);
if (httpRequestHandler != null) {
httpRequestHandler.handleHttpRequest(execution, request.getHttpRequest(), null);
}
// Validate request
validateRequest(request.getHttpRequest());
boolean parallelInSameTransaction;
if (httpServiceTask.getParallelInSameTransaction() != null) {
parallelInSameTransaction = httpServiceTask.getParallelInSameTransaction();
} else {
parallelInSameTransaction = processEngineConfiguration.getHttpClientConfig().isDefaultParallelInSameTransaction();View on GitHub (pinned to d6d39ce1c6)
Solutions
- Inspect the wrapped cause (getCause()) to see the original expression-evaluation failure.
- Validate all request fields in the BPMN XML: URL, method, headers, body — ensure referenced variables exist (default them: ${var:defaultValue}).
- Test expressions in isolation (e.g. via a small unit test with an ExpressionManager) before deploying the process.
- Guard expressions with null-safe checks: ${var != null ? var : ''} or provide defaults via execution listeners.
- If your own delegate/field throws, throw FlowableException directly so it isn't double-wrapped.
Example fix
// before
<flowable:field name="requestUrl" expression="${externalUrl}"/> <!-- externalUrl may be null -->
// after
<flowable:field name="requestUrl" expression="${externalUrl != null ? externalUrl : 'https://default.example.com'}"/> Defensive patterns
Strategy: validation
Validate before calling
// before the http service task runs
Map<String, Object> vars = runtimeService.getVariables(executionId);
if (vars.get("externalUrl") == null || String.valueOf(vars.get("externalUrl")).isBlank()) {
throw new IllegalArgumentException("externalUrl must be set before HTTP task");
} Try / catch
try {
httpActivityDelegate.execute(delegateExecution);
} catch (FlowableException e) {
if (e.getMessage().startsWith("HTTP_TASK_REQUEST_FIELD_INVALID")) {
logger.error("invalid http request fields: {}", e.getCause(), e);
}
} Prevention
- Null-guard/default all variables referenced in HTTP task request expressions.
- Dry-run request field expressions in a test harness before deployment.
- Validate BPMN http task fields (URL, headers, body) with a model validator.
When it happens
Trigger: A service task of type 'http' has request field expressions (httpTask URL, headers, body) that throw when evaluated against the execution — missing variables, bad expression syntax, unresolvable Spring beans, null URL — and the underlying exception is not already a FlowableException.
Common situations: URL expression referencing a variable not present in the execution; typo in variable name; expression returning null for the URL; invalid header expressions; missing Spring bean referenced in an expression; wrong field type in the task's <extensionElements>.
Understand the failure class
Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.
Related errors
- scopeContainer cannot be null
- Unable to resolve formFieldValidationExpression to boolean v
- Unable to resolve formFieldValidationExpression without vari
- Expression condition ${condition} did not evaluate to a bool
- Unknown property used in expression:
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/e21f95afec04fda6.
Report an issue: GitHub.