Когда кто-то вставляет новый объект в файл drl, а затем хочет сравнить его строковое представление числа с другим числом в следующих правилах, Drools дает исключение. Гораздо понятнее с примером.
rule "rule_1"
dialect "mvel"
salience -10
when
then
Resource resource = new Resource();
resource.setAmount("10"); //note - this accepts only Strings
insert(resource);
end
rule "rule_2"
dialect "mvel"
salience -20
when
$resource: Resource(Double.parseDouble(amount) > 0.0) //exception
//$resource: Resource(amount == "10") - no error here
then
System.out.println("$resource.value = " + $resource.amount);
end
Исключение составляет: Причина: [Ошибка: Double.parseDouble (сумма): ноль]
[Рядом: {... Double.parseDouble (количество)> 0 ....}]
-------------- ^
Интересно, что когда вы сравниваете его как строку (сумма == "10") - все работает нормально. Но когда вы пытаетесь разобрать «сумму» в Double, тогда Java не знает, что вообще существует какое-либо значение (думает, что количество == ноль и, следовательно, не может его проанализировать).
Вторая интересная вещь заключается в том, что если вы создали этот объект (ресурс) в java и вставили его до того, как поле «fireAllRules ()» - «amount» станет видимым для анализатора, и он будет работать.
Но дело в том, что я не могу создать этот объект до запуска правил, потому что я не знаю, будет ли в этом необходимость. И мои поля тоже должны быть String. И я должен сравнить это как «больше» или «меньше чем», поэтому сравнение строк не применимо.
Я пытался создать функцию перед правилом, как:
function boolean isValid(String s){
try {
Double.valueOf(s);
return true;
} catch(Exception e){
return false;
}
}
Не работает также.