Я использую в своем приложении Drools 6.1.0.
Мы планируем написать один огромный файл .drl, который будет содержать все правила.
В основном будет 2 категории правил: 1. Проверка на нулевые значения. 2. Бизнес-валидация.
Используя группу потока правил, группу активации и значимость, я планирую управлять тем, какие правила выполнять / запускать при добавлении факта в сеанс.
Даже если с таким подходом решение не работает для меня, потому что.
Допустим, у меня есть файл .drl ниже
rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when
$m : Message(innerMsg.something == null)
then
// do something
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg.something.something == null)
then
// do something
rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when
$m : Message(innerMsg.something.something.something == null)
then
// do something
В документации Drools сказано: «Все ограничения оцениваются при вставке факта. Из руководства Drools: оценка условия не привязана к определенной последовательности оценки или моменту времени, но происходит постоянно, в любое время в течение срок службы двигателя. "
Итак, что происходит, так это то, что код, выполняющий этот файл, выдает исключение Nullpointer для правила 2, потому что innerMsg.something.something
равно NULL
Примечание: я не хочу объединять все нулевые проверки с помощью || в одном операторе when, потому что я хочу зафиксировать конкретное нулевое условие и на его основе создать сообщение об ошибке.
Мои вопросы приведены ниже.
- Хорошая идея - использовать правила слюни для проверки Null для связывания объектов.
- Должен ли я использовать что-то еще, например, последовательное выполнение правил (не уверен, доступно ли это в Drools), которое позволит мне выполнять правила в определенном порядке.
- Есть ли другой способ добиться этого?