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
- List existing properties via GET /management/properties and use an exact existing name.
- Check spelling and case of the engineProperty path segment.
- Create the property first via POST /management/properties before updating/deleting it.
- 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
- Always list GET /management/properties to discover valid names first.
- Centralize property names as constants instead of inline strings.
- Treat 404 on property update as a signal to create the property.
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
- Could not find a case instance with id '${caseInstanceId}'.
- Historic task instance '' variable value for couldn't be fo
- Historic variable instance '' couldn't be found.
- Timer job with id '' doesn't have an exception stacktrace.
- Suspended job with id '' doesn't have an exception stacktrac
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/681c51c348e3d07e.
Report an issue: GitHub.