flowable/flowable-engine · error · FlowableObjectNotFoundException

Engine property ${engineProperty} does not exist

Error message

Engine property ${engineProperty} does not exist

What it means

The Flowable REST engine-properties resource validates that a property name exists in the process engine's properties table before allowing a GET-style check used by update or delete operations. When managementService.getProperties() returns a map that does not contain the requested key, a FlowableObjectNotFoundException is thrown. This indicates the caller referenced a property name that was never created in the ACT_GE_PROPERTY table.

Source

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

        @ApiResponse(code = 404, message = "Indicates the requested property was not found.")
    })
    @DeleteMapping(value = "/management/engine-properties/{engineProperty}", produces = "application/json")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteEngineProperty(@ApiParam(name = "engineProperty") @PathVariable String engineProperty) {
        validateAccessToProperties();

        validatePropertyExists(engineProperty);

        managementService.executeCommand(commandContext -> {
            CommandContextUtil.getPropertyEntityManager(commandContext).delete(engineProperty);
            return null;
        });
    }

    protected void validatePropertyExists(String engineProperty) {
        Map<String, String> properties = managementService.getProperties();
        if (!properties.containsKey(engineProperty)) {
            throw new FlowableObjectNotFoundException("Engine property " + engineProperty + " does not exist");
        }
    }

    @ApiOperation(value = "Create a new engine property", tags = { "EngineProperties" }, code = 201)
    @ApiResponses(value = {
        @ApiResponse(code = 201, message = "Indicates the property is created"),
        @ApiResponse(code = 409, message = "Indicates the property already exists")
    })
    @PostMapping(value = "/management/engine-properties", produces = "application/json")
    @ResponseStatus(HttpStatus.CREATED)
    public void createEngineProperty(@RequestBody PropertyRequestBody propertyRequestBody) {
        validateAccessToProperties();

        Map<String, String> properties = managementService.getProperties();
        String propertyName = propertyRequestBody.getName();
        if (properties.containsKey(propertyName)) {
            throw new FlowableConflictException("Engine property " + propertyName + " already exists");
        }

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. List existing properties via GET /management/properties and use an exact existing name.
  2. Check spelling and case of the engineProperty path segment.
  3. Create the property first via POST /management/properties before updating/deleting it.
  4. Verify the database (ACT_GE_PROPERTY table) actually contains the row for that property.

Example fix

// before
curl -X DELETE http://localhost:8080/flowable-rest/management/properties/batch.job.timeout
// after
# confirm the name exists first
curl http://localhost:8080/flowable-rest/management/properties
# then use the exact name returned
curl -X DELETE http://localhost:8080/flowable-rest/management/properties/batch.jobTimeOut
Defensive patterns

Strategy: validation

Validate before calling

// fetch existing properties and check the name before PUT/DELETE
const props = await fetch(`${base}/management/properties`).then(r => r.json());
if (!props.data.some(p => p.name === propertyName)) {
  throw new Error(`Engine property '${propertyName}' does not exist`);
}

Try / catch

try {
  await updateEngineProperty(name, value);
} catch (e) {
  if (e.status === 404) { /* property missing: create it or abort */ }
  else throw e;
}

Prevention

When it happens

Trigger: Calling PUT/DELETE on /management/properties/{engineProperty} (via updateEngineProperty or deleteEngineProperty) when the property name is not present in the engine's property map.

Common situations: Typos in the property name (e.g. 'next.dbid' vs 'next.dbid '), attempting to modify a property from a different Flowable version, or deleting a property that was already removed by another process or a schema migration.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


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