There are various properties and beans you can configure when utilizing Broadleaf’s Rules Engine.
SpelExpressionParserThe SpelRuleEvaluationService expects an org.springframework.expression.ExpressionParser to be provided in its constructor, and a default org.springframework.expression.spel.standard.SpelExpressionParser bean is registered in the auto-configuration.
The parser itself is configured through the org.springframework.expression.spel.SpelParserConfiguration bean.
The values supplied to the parser configuration are sourced from properties in RuleBuilderParserProperties to allow simple customizations without code changes:
| Property | Description |
|---|---|
|
Determines the mode for the |
|
Tells the parser whether to automatically initialize (grow) null references. Defaults to false. |
|
Tells the parser whether to automatically grow collections. This determines whether an array or collection should be expanded to accommodate an out-of-bounds index. Defaults to false. |
|
Tells the parser the maximum size to which the collection can automatically grow. Defaults to the maximum allowed integer value. |
The org.springframework.expression.spel.SpelParserConfiguration also takes an optional classloader argument to serve as the basis for expression compilation.
If not supplied, the context classloader for the thread that is running during the expression evaluation will be used.
By default, the class loader will be sourced from these places, in order of highest to lowest precedence:
Classloader of the thread running during bean initialization of the configuration
Classloader of the RulesEngineAutoConfiguration class
System classloader
EvaluationContext produced by CachingStdEvaluationContextFactoryFor every invocation of CachingStdEvaluationContextFactory#getEvaluationContext(), we expect to populate each EvaluationContext with the root object and variables from the ExpressionContext.
However, it may be useful to also load additional information in every created EvaluationContext.
Imagine a scenario where you want every rule to be able to use some common utility functions. If that’s the case, it makes sense to expose those utility functions through default variables loaded into every EvaluationContext.
The factory accepts a Map<String, Object> of "default expression variables" in its constructor, and it will set each of these onto every EvaluationContext it creates.
The map of variables is sourced from the defaultExpressionVariables bean defined in the auto-configuration.
To add or change the default variables, simply override that bean.
Out of the box, Broadleaf provides a handful of values in this map that serve as shortcuts to useful utility classes.
For example, there is an entry for strings that exposes the StringExpressionVariable object, which is effectively just a wrapper around the popular org.apache.commons.lang3.StringUtils library.
A rule can then reference this object like #strings.equals(name, 'Expected Name').
| Variable name | Object value | Description |
|---|---|---|
|
|
Common, null-safe, string operations |
|
|
Common, null-safe, date operations |
|
|
Common, null-safe, locale operations |
|
|
Common, null-safe, collection operations |
|
|
Common, null-safe, decimal operations |
|
|
Common, null-safe operations for |
|
|
General object utilities |
If you want to customize how properties of objects referenced in rules are accessed, you’ll need to introduce new org.springframework.expression.PropertyAccessor implementations and ensure they are present in each EvaluationContext.
The factory accepts a list of PropertyAccessor objects in its constructor, and it will set each of these onto every EvaluationContext it creates.
To add or change the default property accessors, override the defaultPropertyAccessors list bean.