Drools получает объект из исключения map mvel cast - PullRequest
0 голосов
/ 05 августа 2020

Я использую jboss EAP 7.2 и Red Hat Decision Central 7.5.0

У меня есть такие настраиваемые объекты

public class Model{
    private String id;
    private Map<String, Object> map;

    // ... getters and setters
}

public class ParameterModel{
   private String parameterName;
   private BigDecimal maxValue;
   private BigDecimal minValue;
   private Object value;

   // ... getters and setters
}

Я создал новый объект «Модель» с настраиваемым Атрибут "id" и атрибут "map" содержат пары.

Я отправил его менеджеру по принятию решений и пускает слюни. Я хочу получить атрибуты ParameterModel, но не смог.

Мое правило приведено ниже.

package com.rule.test;

import com.test.Model;
import com.test.ParameterModel;
    
rule "drools1"
    when
        Model(getId().equals("1"), Integer.parseInt(((ParameterModel)getMap().get("param1")).getValue().toString())>10)
    then
        System.out.println("Error on " + drools.getRule().getName());
end

Исключение находится ниже.

Причина: [Ошибка: нулевой указатель: Integer.parseInt (((ParameterModel) getMap (). get ("param1")). getValue (). toString ())] [Рядом: {... Integer.parseInt (((ParameterMo ....}] В [Правило "drools1" в com / rule / test / test.drl]

Вызвано: java. lang.NullPointerException в org.mvel2.DataConversion.convert (DataConversion. java: 129) в org.mvel2.ast.TypeCast.getReducedValueAccelerated (TypeCast. java: 74) в org.mvel2.compiler.ExecutableAccessor.getV ExecutableAccessor. java: 38) в org.mvel2.ast.Substatement.getReducedValueAccelerated (Substatement. java: 44) в org.mvel2.ast.Union.getReducedValueAccelerated (Union. java: 44) в org.mvel2 .compiler.ExecutableAccessor.getValue (ExecutableAccessor. java: 38) в org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMetho d (ReflectiveAccessorOptimizer. java: 970) на org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain (ReflectiveAccessorOptimizer. java: 396)

Всем спасибо.

1 Ответ

0 голосов
/ 17 августа 2020

Drools имеет множество встроенных проверок на null, но если вы настаиваете на обходе, вы получите много ошибок.

Другой интересный вид Drools - это особые синтаксис для карт - get("foo") можно записать как this["foo"].

rule "drools1"
when
  Model( id == "1", // equivalent to getId().equals("1")
         $map: map != null )

  // Special syntax for getting stuff from maps:
  Map( $param1: this["param1"] != null ) from $map 

  ParameterModel( $value: value != null ) from $param1
  Integer( this > 10 ) from Integer.parseInt($value.toString())
then
  System.out.println("Error on " + drools.getRule().getName());
end

Почему ваша версия давала NPE? Понятия не имею, но в исходной форме это было почти нечитаемо. Все, что действительно можно было почерпнуть из трассировки стека, это то, что это происходило на каком-то этапе неявного преобразования. 1013 * превращается в строковое представление целого числа.

Обратите внимание, что если value является на самом деле целочисленным типом, вам не нужно тратить время на синтаксический анализ int и можно просто сделайте:

Integer(this > 10) from $value
...