从 Drools 调用重载方法:`无法使用严格模式解析方法`
Call overloaded method from Drools: `unable to resolve method using strict-mode`
我是 java 和流口水的新手,我必须构建一个 java RESTful Web 服务/规则引擎。我们已经拥有 Genesys 规则创作 (GRAT) 和 Genesys 规则引擎 (GRE)(版本 8.1.2),他们 运行 流口水版本 5.2。我们需要获取 GRAT 包的源代码,并在 "lite rule engine" 中为我们的开发环境使用它们。对于我的 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)。您还会看到使用 (Integer, 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 运行 像我一样流口水 5.2 并且它适用于 GRE,我认为它必须存在一个解决方案,而不是添加 .toString() 或类似的东西。考虑到我们的package很多,有的package有几千条规则,我不想对每条规则都做调整。
有人有解决该问题的想法吗? He/She会是我的英雄!
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
谢谢
阿兰
在任何 Drools 版本中无法重载 DRL 函数。
函数问题的通常解决方法(有更多限制)是使用和导入来自 class 的静态 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 一起使用(这对我来说太旧了)。在 5.x 开发期间将 MVEL 集成到 Drools 中时充满了错误。不过,经过大量的努力,情况有所改善。
所以它可以工作,即使在 5.5 和 6.2 版本中使用方言 MVEL。您必须升级到 5.5、5.6 或 6.2。后者将意味着对用于编译和执行的 Java 代码进行一些更改。
我是 java 和流口水的新手,我必须构建一个 java RESTful Web 服务/规则引擎。我们已经拥有 Genesys 规则创作 (GRAT) 和 Genesys 规则引擎 (GRE)(版本 8.1.2),他们 运行 流口水版本 5.2。我们需要获取 GRAT 包的源代码,并在 "lite rule engine" 中为我们的开发环境使用它们。对于我的 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)。您还会看到使用 (Integer, 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 运行 像我一样流口水 5.2 并且它适用于 GRE,我认为它必须存在一个解决方案,而不是添加 .toString() 或类似的东西。考虑到我们的package很多,有的package有几千条规则,我不想对每条规则都做调整。
有人有解决该问题的想法吗? He/She会是我的英雄!
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
谢谢
阿兰
在任何 Drools 版本中无法重载 DRL 函数。
函数问题的通常解决方法(有更多限制)是使用和导入来自 class 的静态 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 一起使用(这对我来说太旧了)。在 5.x 开发期间将 MVEL 集成到 Drools 中时充满了错误。不过,经过大量的努力,情况有所改善。
所以它可以工作,即使在 5.5 和 6.2 版本中使用方言 MVEL。您必须升级到 5.5、5.6 或 6.2。后者将意味着对用于编译和执行的 Java 代码进行一些更改。