{"record":{"id":"5b47379866ccee57","repo":"flowable/flowable-engine","slug":"cannot-parse-el-property-prop-cache-size","errorCode":null,"errorMessage":"Cannot parse EL property ${PROP_CACHE_SIZE}","messagePattern":"Cannot parse EL property (.+?)","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":350,"sourceCode":"\t\t\tif (getFeatureProperty(profile, properties, Feature.VARARGS, PROP_VAR_ARGS)) {\n\t\t\t\tfeatures.add(Builder.Feature.VARARGS);\n\t\t\t}\n\t\t\tif (getFeatureProperty(profile, properties, Feature.NULL_PROPERTIES, PROP_NULL_PROPERTIES)) {\n\t\t\t\tfeatures.add(Builder.Feature.NULL_PROPERTIES);\n\t\t\t}\n\t\t\tif (getFeatureProperty(profile, properties, Feature.IGNORE_RETURN_TYPE, PROP_IGNORE_RETURN_TYPE)) {\n\t\t\t\tfeatures.add(Builder.Feature.IGNORE_RETURN_TYPE);\n\t\t\t}\n\t\t\tbuilder = createTreeBuilder(properties, features.toArray(new Builder.Feature[0]));\n\t\t}\n\n\t\t// create cache\n\t\tint cacheSize = defaultCacheSize;\n\t\tif (properties != null && properties.containsKey(PROP_CACHE_SIZE)) {\n\t\t\ttry {\n\t\t\t\tcacheSize = Integer.parseInt(properties.getProperty(PROP_CACHE_SIZE));\n\t\t\t} catch (NumberFormatException e) {\n\t\t\t\tthrow new ELException(\"Cannot parse EL property \" + PROP_CACHE_SIZE, e);\n\t\t\t}\n\t\t}\n\t\tCache cache = cacheSize > 0 ? new Cache(cacheSize) : null;\n\n\t\treturn new TreeStore(builder, cache);\n\t}\n\n\t/**\n\t * Create the factory's type converter. This implementation takes the\n\t * <code>de.odysseus.el.misc.TypeConverter</code> property as the name of a class implementing\n\t * the <code>de.odysseus.el.misc.TypeConverter</code> interface. If the property is not set, the\n\t * default converter (<code>TypeConverter.DEFAULT</code>) is used.\n\t */\n\tprotected TypeConverter createTypeConverter(Properties properties) {\n\t\tClass<?> clazz = load(TypeConverter.class, properties);\n\t\tif (clazz == null) {\n\t\t\treturn TypeConverter.DEFAULT;\n\t\t}","sourceCodeStart":332,"sourceCodeEnd":368,"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#L332-L368","documentation":"createTreeStore() reads the PROP_CACHE_SIZE property to size the expression parse-tree cache. If the value is not a valid integer, NumberFormatException is wrapped in ELException 'Cannot parse EL property ${PROP_CACHE_SIZE}'. The property must parse via Integer.parseInt.","triggerScenarios":"Constructing ExpressionFactoryImpl with a Properties map containing a non-numeric value for the cache-size key (e.g. \"1024m\", \"1,024\", or whitespace-polluted value); also happens when a custom properties file supplies the key with a bad value.","commonSituations":"Tuning the EL cache by editing a properties file by hand and using a suffix or thousands separator; environment-specific property substitution that left a placeholder unresolved.","solutions":["Set the cache size property to a plain integer literal, e.g. 1024","Remove the property entirely to fall back to defaultCacheSize","Check for unresolved ${...} placeholders left by property substitution in the config file"],"exampleFix":"// before\ndep.odysseus.el.tree.impl.TreeStore.cacheSize = 512m\n\n// after\nde.odysseus.el.tree.impl.TreeStore.cacheSize = 512","handlingStrategy":"validation","validationCode":"String raw = props.getProperty(\"de.odysseus.el.tree.impl.TreeStore.cacheSize\");\nif (raw != null && !raw.trim().matches(\"\\\\d+\")) {\n    throw new IllegalArgumentException(\"cacheSize must be a plain integer, got: \" + raw);\n}","typeGuard":null,"tryCatchPattern":"try {\n    ExpressionFactory factory = new ExpressionFactoryImpl(props);\n} catch (ELException e) {\n    if (e.getMessage().contains(\"Cannot parse EL property\")) {\n        log.error(\"Fix cacheSize property to an integer literal\", e);\n    }\n    throw e;\n}","preventionTips":["Use plain integer literals for numeric tuning properties","Beware ${placeholder} substitution leaving unresolved tokens","Validate config files with a schema or unit test at build time"],"tags":["el","configuration","parsing","number-format","flowable"],"backgroundTag":"invalid-config-value","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"}