flowable/flowable-engine · error · FlowableIllegalArgumentException

Only one of 'orderAscendingColumn' or…

Error message

Only one of 'orderAscendingColumn' or 'orderDescendingColumn' can be supplied.

What it means

GET /management/tables/{tableName} accepts optional sorting parameters orderAscendingColumn and orderDescendingColumn. Supplying both is ambiguous, so a FlowableIllegalArgumentException is thrown. The endpoint only supports one sort direction per request.

Solutions

  1. Remove one of the two parameters from the request, keeping only the column you want to sort by.
  2. In client code, mutually exclude the parameters before building the URL.
  3. Handle HTTP 400 from this endpoint and retry with a single sort parameter.

Example fix

// before
params = 'orderAscendingColumn=ID_&orderDescendingColumn=NAME_';
// after
params = 'orderAscendingColumn=ID_';
Defensive patterns

Strategy: validation

Validate before calling

if (orderAsc && orderDesc) throw new Error('Supply only one of orderAscendingColumn/orderDescendingColumn');

Try / catch

try { ... } catch (e) { if (e.status === 400) retryWithSingleSort(); else throw e; }

Prevention

When it happens

Trigger: GET /management/tables/ACT_RU_TASK?orderAscendingColumn=ID_&orderDescendingColumn=NAME_ — both parameters present in the same request.

Common situations: Client code builds the query string dynamically and appends both parameters; a UI with two sort dropdowns sending both values instead of clearing one.

Related errors


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

Appendix: source

Thrown at modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/TableDataResource.java:86

            @ApiResponse(code = 200, message = "Indicates the table exists and the table row data is returned"),
            @ApiResponse(code = 404, message = "Indicates the requested table does not exist.")
    })
    @GetMapping(value = "/management/tables/{tableName}/data", produces = "application/json")
    public DataResponse<List<Map<String, Object>>> getTableData(@ApiParam(name = "tableName") @PathVariable String tableName, @ApiParam(hidden = true) @RequestParam Map<String, String> allRequestParams) {
        if (restApiInterceptor != null) {
            restApiInterceptor.accessTableInfo();
        }
        
        // Check if table exists before continuing
        if (managementService.getTableMetaData(tableName) == null) {
            throw new FlowableObjectNotFoundException("Could not find a table with name '" + tableName + "'.", String.class);
        }

        String orderAsc = allRequestParams.get("orderAscendingColumn");
        String orderDesc = allRequestParams.get("orderDescendingColumn");

        if (orderAsc != null && orderDesc != null) {
            throw new FlowableIllegalArgumentException("Only one of 'orderAscendingColumn' or 'orderDescendingColumn' can be supplied.");
        }

        Integer start = null;
        if (allRequestParams.containsKey("start")) {
            start = Integer.valueOf(allRequestParams.get("start"));
        }

        if (start == null) {
            start = 0;
        }

        Integer size = null;
        if (allRequestParams.containsKey("size")) {
            size = Integer.valueOf(allRequestParams.get("size"));
        }

        if (size == null) {
            size = DEFAULT_RESULT_SIZE;

View on GitHub (pinned to d6d39ce1c6)