当前位置: 首页 > 知识库问答 >
问题:

从Drools调用重载方法:`无法使用严格模式解析方法`

徐奇逸
2023-03-14

我是java和drools的新手,我必须构建一个java RESTful Web Services/规则引擎。我们已经有运行drools版本5.2的Genesys规则创作(GRAT)和Genesys规则引擎(GRE)(版本8.1.2)。我们需要获取GRAT包的源代码并在我们的开发环境的“lite规则引擎”中使用它们。对于我的POC,我安装了drools 5.2并创建了一个项目,它可以像我想要的那样消化我的包并触发规则。但对于某些包,我有这种错误:

BuildError: Unable to Analyse Expression $routingparams.priority = obtenirValeurParametre($routingparams.priority,"100");
$routingparams.target1 = obtenirValeurParametre($routingparams.target1, "AVGRP_GPAP_AEP_TA_MDP_E");:
[Error: unable to resolve method using strict-mode: com.desjardins.gtd.dpsccc.routage.gpap.routingparams.ObtenirValeurParametre.obtenirValeurParametre(java.lang.Integer, java.lang.String)]
[Near : {... ngparams.priority = obtenirValeurParametre($routin ....}]

如果你在最后查看包,你会看到函数obtenirValeurParametre(String, String)。你还会看到这个函数调用(整数,字符串),错误在这一行。在drools包中,我不能用不同的参数拥有相同的函数。我尝试使用“drools.dialect.mvel.strict”=false,但它不会改变任何东西。

KnowledgeBuilderConfiguration kbConfig =KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
kbConfig.setProperty("drools.dialect.mvel.strict", "false");
System.setProperty("drools.dialect.mvel.strict", "false");
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( kbConfig );

由于GRE run和我一样是drools 5.2,而且它也适用于GRE,我认为它必须存在一个解决方案,然后再添加。toString()或类似的内容。考虑到我们有很多套餐,其中一些有数千条规则,我不想对每一条规则进行调整。

有人有办法解决这个问题吗?他/她将是我的英雄!

package com.desjardins.gtd.dpsccc.routage.gpap.routingparams

import java.util.*;

function String obtenirValeurParametre(String valeurActuelle, String parametre){
    if(parametreEstVide(parametre)) return "";  
    if("*".equals(parametre)) return valeurActuelle;
    else return parametre;
}

function boolean parametreEstVide(String parametre){
    if(parametre.startsWith("{") && parametre.endsWith("}")) return true;
    else return false;
}

declare RoutingParams
    target1: String
    priority: Integer
end 

declare ContexteInteraction
    destination: String
end 

#from row number: 1
rule "Row 1 DT-6249 UNIT_Test Alain"
salience 99000 
    agenda-group "level1"
    dialect "mvel"
    when
        ContexteInteraction( destination == 'GPAP_AEP_TA_MDP')
        $routingparams:RoutingParams(); 
        $contexteInteraction:ContexteInteraction();
    then
        $routingparams.priority = obtenirValeurParametre($routingparams.priority,'100')
        $routingparams.target1 = obtenirValeurParametre($routingparams.target1, 'AVGRP_GPAP_AEP_TA_MDP_E')
end

谢谢

阿兰

共有1个答案

左丘烨烁
2023-03-14

在任何Drools版本中都不可能重载DRL函数。

解决函数问题的通常方法(有更多限制)是使用静态Java方法并从类中导入,例如:

public class Utils {
    public static String 
    obtenirValeurParametre(String valeurActuelle, String parametre){
        if(parametreEstVide(parametre)) return "";  
        return "*".equals(parametre) ? valeurActuelle : parametre;
    }

    public static String 
    obtenirValeurParametre(Integer valeurActuelle, String parametre){
        if(parametreEstVide(parametre)) return "";  
        return "*".equals(parametre) ?
               valeurActuelle.toString() : parametre;
    }

    public static boolean
    parametreEstVide(String parametre){
        return parametre.startsWith("{") && parametre.endsWith("}");
    }
}

您需要对每个DRL文件进行一次更改:

import static the.package.name.Utils.*;

这是个好消息

我已经用5.3版测试过了,但它在方言MVEL中失败了,可以放心地假设它在5.2版中不起作用(这对我来说太旧了)。MVEL在5年期间被集成到Drools中时充满了bug。x-开发。然而,大量的努力工作改善了情况。

因此,即使在版本5.5和6.2中使用方言MVEL,它也是有效的。您必须升级到5.5、5.6或6.2。后者意味着对用于编译和执行的Java代码进行一些更改。

 类似资料:
  • 我是Scala的新手。我正在编写以下代码,其中一个APIendpoint在文件中缓存值(某某JsonData.toString()),另一个endpoint从该文件中检索(Json.parse())。使用wh-thenEnter编写测试时,会出现重载方法错误。 我哪里做错了? 缓存文件内容: 缓存ontroller.scala CacheControlllerTest.scala

  • 我有一个Foo和Bar对象的列表,以及每个相应对象的转换器。 Convert-method需要有所不同,因为Bar1与Bar2和Bar3等有很大不同,但是我想创建一个方法来处理所有可能的列表。 是否可以创建一个泛型方法,根据列表的内容调用相应的非泛型方法? 到目前为止,我已经尝试过了: 但这并不能编译,因为"无法解析方法'Converts(T, S)'" 有什么想法吗?

  • 我正在尝试drools与Spring Boot的集成,如果模型的属性不满足,我想抛出一个异常。 对于这种情况,我有一个客户机模型,希望检查它的lastName字段是否为NULL-如果是,则抛出一个异常。 然而,我在编译时遇到了一个“无法使用严格模式解析方法:org.drools.core.spi.KnowledgeHelper.throw()”。正确的方法是什么? 我已经尝试使用global来更新

  • 本文向大家介绍Java设计模式模板方法模式(Template)用法解析,包括了Java设计模式模板方法模式(Template)用法解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java设计模式模板方法模式(Template)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言:   我们在开发中有很多固定的流程,这些流程

  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。

  • 我编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到中,并将带有转义unicode的格式化的返回给调用方进行其他处理。 Scala编译器在有调用的行中抱怨以下错误: