{"record":{"id":"681c51c348e3d07e","repo":"flowable/flowable-engine","slug":"engine-property-engineproperty-does-not-exist","errorCode":null,"errorMessage":"Engine property ${engineProperty} does not exist","messagePattern":"Engine property (.+?) does not exist","errorType":"http","errorClass":"FlowableObjectNotFoundException","httpStatus":404,"severity":"error","filePath":"modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/EnginePropertiesResource.java","lineNumber":93,"sourceCode":"        @ApiResponse(code = 404, message = \"Indicates the requested property was not found.\")\n    })\n    @DeleteMapping(value = \"/management/engine-properties/{engineProperty}\", produces = \"application/json\")\n    @ResponseStatus(HttpStatus.NO_CONTENT)\n    public void deleteEngineProperty(@ApiParam(name = \"engineProperty\") @PathVariable String engineProperty) {\n        validateAccessToProperties();\n\n        validatePropertyExists(engineProperty);\n\n        managementService.executeCommand(commandContext -> {\n            CommandContextUtil.getPropertyEntityManager(commandContext).delete(engineProperty);\n            return null;\n        });\n    }\n\n    protected void validatePropertyExists(String engineProperty) {\n        Map<String, String> properties = managementService.getProperties();\n        if (!properties.containsKey(engineProperty)) {\n            throw new FlowableObjectNotFoundException(\"Engine property \" + engineProperty + \" does not exist\");\n        }\n    }\n\n    @ApiOperation(value = \"Create a new engine property\", tags = { \"EngineProperties\" }, code = 201)\n    @ApiResponses(value = {\n        @ApiResponse(code = 201, message = \"Indicates the property is created\"),\n        @ApiResponse(code = 409, message = \"Indicates the property already exists\")\n    })\n    @PostMapping(value = \"/management/engine-properties\", produces = \"application/json\")\n    @ResponseStatus(HttpStatus.CREATED)\n    public void createEngineProperty(@RequestBody PropertyRequestBody propertyRequestBody) {\n        validateAccessToProperties();\n\n        Map<String, String> properties = managementService.getProperties();\n        String propertyName = propertyRequestBody.getName();\n        if (properties.containsKey(propertyName)) {\n            throw new FlowableConflictException(\"Engine property \" + propertyName + \" already exists\");\n        }","sourceCodeStart":75,"sourceCodeEnd":111,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/EnginePropertiesResource.java#L75-L111","documentation":"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.","triggerScenarios":"Calling PUT/DELETE on /management/properties/{engineProperty} (via updateEngineProperty or deleteEngineProperty) when the property name is not present in the engine's property map.","commonSituations":"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.","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."],"exampleFix":"// before\ncurl -X DELETE http://localhost:8080/flowable-rest/management/properties/batch.job.timeout\n// after\n# confirm the name exists first\ncurl http://localhost:8080/flowable-rest/management/properties\n# then use the exact name returned\ncurl -X DELETE http://localhost:8080/flowable-rest/management/properties/batch.jobTimeOut","handlingStrategy":"validation","validationCode":"// fetch existing properties and check the name before PUT/DELETE\nconst props = await fetch(`${base}/management/properties`).then(r => r.json());\nif (!props.data.some(p => p.name === propertyName)) {\n  throw new Error(`Engine property '${propertyName}' does not exist`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await updateEngineProperty(name, value);\n} catch (e) {\n  if (e.status === 404) { /* property missing: create it or abort */ }\n  else throw e;\n}","preventionTips":["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."],"tags":["rest-api","not-found","engine-property","flowable"],"backgroundTag":"record-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}