本文介绍了从Drools调用重载方法:`无法使用严格模式解析方法`的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是Java和Drools的新手,我必须构建一个Java REST风格的Web服务/规则引擎。我们已经有了运行Drools版本5.2的Genesys规则创作(GRAT)和Genesys规则引擎(GRE)(版本8.1.2)。我们需要获取GRAT包的源代码,并在我们的开发环境的"lite规则引擎"中使用它们。对于我的POC,我安装了Drools5.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 ....}]

如果您查看末尾的Package,您将看到函数obtenirValeurParametre(字符串,字符串)。您还将看到使用(Integer,字符串)进行此函数调用,错误在该行上。在Drools包中,我不能用不同的参数拥有相同的函数。我曾尝试使用"drools.Dialt.mvel.Strong"=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像我一样运行Drools5.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

谢谢

阿兰

推荐答案

任何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版上工作(它太旧了,我不能随身携带)。在5.x开发期间,MVEL在集成到Drools时充满了错误。然而,大量的艰苦工作已经改善了情况。

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

这篇关于从Drools调用重载方法:`无法使用严格模式解析方法`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-16 19:20