{"record":{"id":"bcb4c55dea5c14e3","repo":"flowable/flowable-engine","slug":"cannot-read-el-properties","errorCode":null,"errorMessage":"Cannot read EL properties","messagePattern":"Cannot read EL properties","errorType":"exception","errorClass":"ELException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ExpressionFactoryImpl.java","lineNumber":299,"sourceCode":"\t\t}\n\t\treturn null;\n\t}\n\n\tprivate Properties loadProperties(String path) {\n\t\tProperties properties = new Properties(loadDefaultProperties());\n\n\t\t// try to find and load properties\n\t\tInputStream input = null;\n\t\ttry {\n\t\t\tinput = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);\n\t\t} catch (SecurityException e) {\n\t\t\tinput = ClassLoader.getSystemResourceAsStream(path);\n\t\t}\n\t\tif (input != null) {\n\t\t\ttry {\n\t\t\t\tproperties.load(input);\n\t\t\t} catch (IOException e) {\n\t\t\t\tthrow new ELException(\"Cannot read EL properties\", e);\n\t\t\t} finally {\n\t\t\t\ttry {\n\t\t\t\t\tinput.close();\n\t\t\t\t} catch (IOException e) {\n\t\t\t\t\t// ignore...\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn properties;\n\t}\n\n\tprivate boolean getFeatureProperty(Profile profile, Properties properties, Feature feature, String property) {\n\t\treturn Boolean.valueOf(properties.getProperty(property, String.valueOf(profile.contains(feature))));\n\t}\n\n\t/**\n\t * Create the factory's tree store. This implementation creates a new tree store using the","sourceCodeStart":281,"sourceCodeEnd":317,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/de/odysseus/el/ExpressionFactoryImpl.java#L281-L317","documentation":"loadProperties() loads a user-supplied EL properties file (given by path) from the classpath or filesystem. If the stream is found but properties.load() throws an IOException, it wraps it as ELException 'Cannot read EL properties'. Unlike the default-properties variant, the resource here is application-provided.","triggerScenarios":"Creating an ExpressionFactoryImpl (or ExpressionFactory.newInstance) with a Properties entry pointing to a custom EL properties file whose contents cannot be parsed as a java.util.Properties stream — malformed input, wrong encoding, or stream that fails mid-read.","commonSituations":"Hand-edited juel.properties / EL properties file with invalid syntax or binary garbage; file on classpath with wrong encoding (not ISO-8859-1/escape format); truncated resource copied into the WAR.","solutions":["Fix the syntax of the custom properties file — escape special characters and use latin-1/\\uXXXX escapes","Validate the file loads standalone with new Properties().load(new FileInputStream(file)) before deploying","Re-copy the resource into the classpath (verify it is not truncated)"],"exampleFix":"// before (broken el.properties)\ncacheSize=1024\nbuilder=de.odysseus.el.tree.impl\n???\n\n// after\nde.odysseus.el.tree.impl.TreeStore.cacheSize = 1024","handlingStrategy":"validation","validationCode":"// Validate a custom EL properties file before pointing the factory at it\nProperties p = new Properties();\ntry (InputStream in = new FileInputStream(\"el.properties\")) {\n    p.load(in); // will throw IOException on malformed content\n}","typeGuard":null,"tryCatchPattern":"try {\n    ExpressionFactory factory = new ExpressionFactoryImpl(props);\n} catch (ELException e) {\n    if (e.getCause() instanceof IOException) {\n        log.error(\"Custom EL properties file unreadable/malformed\", e);\n    }\n    throw e;\n}","preventionTips":["Escape non-latin1 characters as \\uXXXX in properties files","Load-test properties files in CI before shipping","Never hand-edit deployed files; regenerate via build"],"tags":["io","properties","el","configuration","flowable"],"backgroundTag":"file-read-failed","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"}