flowable/flowable-engine · error · FlowableException

HTTP method not supported

Error message

${method} HTTP method not supported

What it means

SpringWebClientFlowableHttpClient.prepareRequest maps an HTTP method name from the FlowableHttpRequestInfo to a Spring WebClient builder branch via a switch. Only GET, POST, PUT, DELETE, PATCH, HEAD and OPTIONS are handled; any other method string falls into the default branch and throws this FlowableException. It is a guard against unsupported HTTP verbs in the reactive WebClient-based HTTP client.

Solutions

  1. Change the request to one of the supported methods: GET, POST, PUT, DELETE, PATCH, HEAD or OPTIONS.
  2. If a custom verb is genuinely required, implement a custom FlowableHttpClient that handles the method instead of the Spring WebClient one.
  3. Verify the method value is not coming from an incorrectly populated process variable or config field (check for typos/whitespace/case).

Example fix

// before
<flowable:httpRequest method="PURGE" .../>

// after
<flowable:httpRequest method="DELETE" .../>
Defensive patterns

Strategy: validation

Validate before calling

Set<String> supported = Set.of("GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS");
if (!supported.contains(method)) {
    throw new IllegalArgumentException("Unsupported HTTP method: " + method);
}

Try / catch

try {
    client.prepareRequest(requestInfo);
} catch (FlowableException e) {
    if (e.getMessage().endsWith("HTTP method not supported")) {
        // fall back to POST or reject the task
    }
}

Prevention

When it happens

Trigger: Calling the Spring WebClient Flowable HTTP client with requestInfo.getMethod() set to a verb outside the supported set, e.g. a custom method like 'PURGE' or 'TRACE', or a lowercase/malformed method string.

Common situations: BPMN HTTP task or service task configured with an unusual method in its flowable:httpRequest XML; dynamically built method strings from process variables; older process definitions using methods unsupported by WebClient.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-http-common/src/main/java/org/flowable/http/common/impl/spring/reactive/SpringWebClientFlowableHttpClient.java:162

                    headersSpec = patch;
                    break;
                }
                case "DELETE": {
                    WebClient.RequestBodySpec delete = webClient.method(HttpMethod.DELETE).uri(uri);
                    setRequestEntity(requestInfo, delete);
                    headersSpec = delete;
                    break;
                }
                case "HEAD": {
                    headersSpec = webClient.head().uri(uri);
                    break;
                }
                case "OPTIONS": {
                    headersSpec = webClient.options().uri(uri);
                    break;
                }
                default: {
                    throw new FlowableException(requestInfo.getMethod() + " HTTP method not supported");
                }
            }

            setHeaders(headersSpec, requestInfo.getHttpHeaders());
            setHeaders(headersSpec, requestInfo.getSecureHttpHeaders());

            return new WebClientExecutableHttpRequest(headersSpec, !requestInfo.isNoRedirects());
        } catch (URISyntaxException ex) {
            throw new FlowableException("Invalid URL exception occurred", ex);
        }
    }

    public static boolean shouldFollowRedirect(HttpClientRequest request, HttpClientResponse response) {
        boolean followRedirect = request.currentContextView().getOrDefault(FOLLOW_REDIRECT_CONTEXT_KEY, Boolean.FALSE);
        int statusCode = response.status().code();
        return followRedirect && statusCode >= 300 && statusCode < 400;
    }

View on GitHub (pinned to d6d39ce1c6)