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

readKnowledgebase出现Drools错误

金阳华
2023-03-14

我正在尝试一个非常基本的规则来测试流口水是否有效,我将其与Hibernate连接,但我发现错误“java.lang.ArrayIndexOutOfBoundsException:-1”这是main:包metier;

import java.util.Iterator;
import java.util.List;

import metier.environnements.Reseau;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.hibernate.Query;
import org.hibernate.Session;

import util.HibernateUtil;



/* This is a sample class to launch a rule. */

public class testingRules {
public static void main(String[] args) {

        Session session =HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();



        Query query=session.createQuery("from Reseau");
        List l =query.list();
        Iterator reseaux = query .iterate();

        while (reseaux.hasNext()) {

        Reseau reseau = (Reseau) reseaux.next();

        // Set the process start arguments.


        StatefulKnowledgeSession sks = getSKS();
        sks.insert(reseau);
        sks.fireAllRules();
}

session.getTransaction().commit();



    }

    /**
     * Creates a basic {@link StatefulKnowledgeSession} which contains the <code>BPMN2</code> process definition of our sample process.
     * 
     * @return
     */
    private static StatefulKnowledgeSession getSKS() {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(
                ResourceFactory
                        .newClassPathResource("Reseau.drl"),
                ResourceType.DRL);
        KnowledgeBase kbase = kbuilder.newKnowledgeBase();

        return kbase.newStatefulKnowledgeSession();
    }

    }

以及。drl文件为:

package metier.environnements

import metier.taches.ActiviteProfessionnelle;
import metier.taches.Utilisateur;



rule "Réseaux_disponibles"  // donne les réseaux disponibles dans la localisation de l'utilisateur
ruleflow-group "networks"
    when
      reseau :  Reseau (reseau.getCle() == "mot")
    then
        System.out.println ("Réseaux disponibles");

end

出现的错误是:

java.lang.ArrayIndexOutOfBoundsException: -1
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeCastExpressionWithNameArray(Parser.java:1984)
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:5992)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9272)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9500)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9457)
    at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:8102)
    at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:696)
    at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:376)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:420)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler.compile(EclipseJavaCompiler.java:389)
    at org.drools.commons.jci.compilers.AbstractJavaCompiler.compile(AbstractJavaCompiler.java:49)
    at org.drools.rule.builder.dialect.java.JavaDialect.compileAll(JavaDialect.java:371)
    at org.drools.compiler.DialectCompiletimeRegistry.compileAll(DialectCompiletimeRegistry.java:46)
    at org.drools.compiler.PackageRegistry.compileAll(PackageRegistry.java:102)
    at org.drools.compiler.PackageBuilder.compileAll(PackageBuilder.java:1006)
    at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:842)
    at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:831)
    at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:467)
    at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:673)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:45)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:34)
    at metier.testingRules.getSKS(testingRules.java:66)
    at metier.testingRules.main(testingRules.java:48)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeCastExpressionWithNameArray(Parser.java:1984)
    at org.eclipse.jdt.internal.compiler.parser.Parser.consumeRule(Parser.java:5992)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9272)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9500)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9457)
    at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:8102)
    at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:696)
    at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:376)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:420)
    at org.drools.commons.jci.compilers.EclipseJavaCompiler.compile(EclipseJavaCompiler.java:389)
    at org.drools.commons.jci.compilers.AbstractJavaCompiler.compile(AbstractJavaCompiler.java:49)
    at org.drools.rule.builder.dialect.java.JavaDialect.compileAll(JavaDialect.java:371)
    at org.drools.compiler.DialectCompiletimeRegistry.compileAll(DialectCompiletimeRegistry.java:46)
    at org.drools.compiler.PackageRegistry.compileAll(PackageRegistry.java:102)
    at org.drools.compiler.PackageBuilder.compileAll(PackageBuilder.java:1006)
    at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:842)
    at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:831)
    at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:467)
    at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:673)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:45)
    at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:34)
    at metier.testingRules.getSKS(testingRules.java:66)
    at metier.testingRules.main(testingRules.java:48)

你知道它是从哪里来的吗?我要怎么修理它?我真的很感激

the class Reseau definition is : 
package metier.environnements;

public class Reseau {

    private Long idReseau;
    private String nom; 
    private String cle;//mot de passe  
    private String etat ;  // disponible ou non 
    private String vitesseTransfert;  //speed
    private String type ; // 3G , LTE , Wifi ...
    private Localisation  localisation;

    // Les getters and setters.

    public Long getIdReseau() {
        return idReseau;
    }


    public void setIdReseau(Long idReseau) {
        this.idReseau = idReseau;
    }


    public String getNom() {
        return nom;
    }


    public void setNom(String nom) {
        this.nom = nom;
    }


    public String getCle() {
        return cle;
    }


    public void setCle(String cle) {
        this.cle = cle;
    }


    public String getEtat() {
        return etat;
    }


    public void setEtat(String etat) {
        this.etat = etat;
    }


    public String getVitesseTransfert() {
        return vitesseTransfert;
    }


    public void setVitesseTransfert(String vitesseTransfert) {
        this.vitesseTransfert = vitesseTransfert;
    }


    public String getType() {
        return type;
    }


    public void setType(String type) {
        this.type = type;
    }


    public Localisation getLocalisation() {
        return localisation;
    }


    public void setLocalisation(Localisation localisation) {
        this.localisation = localisation;
    }



    // Constructeur par defaut  

    public Reseau() {
        super();
        // TODO Auto-generated constructor stub
    }

    // Le constructeur avec les champs , le id sera genere automatiquement  
    public Reseau(String nom, String cle, String etat, String vitesseTransfert,
            String type, Localisation localisation) {
        super();
        this.nom = nom;
        this.cle = cle;
        this.etat = etat;
        this.vitesseTransfert = vitesseTransfert;
        this.type = type;
        this.localisation = localisation;
    }

共有1个答案

羊舌涵涤
2023-03-14

在不检查错误的情况下,切勿调用DRL编译器:

kbuilder.add(..., ResourceType.DRL);
if( kbuilder.hasErrors() ){
    System.err.println( "### compilation errors ###" );
    KnowledgeBuilderErrors errors = kbuilder.getErrors();
    for( KnowledgeBuilderError err: errors ){
        System.err.println( err.toString() );
    }
    throw new IllegalStateException( "compile errors" );
}

但这个问题看起来像是DRL/Java解析步骤中的错误。您使用的是哪个Drools版本?为了再现错误,需要重新定义类别。

旧版本(5.x)Drools中的错误不太可能得到修复。试试6.2。

 类似资料:
  • 嗨,我刚刚开始将OptaPlanner与drools结合使用。然而,我有两个问题。我相信这取决于我对语法的理解。 当我尝试实例化求解器时,以下规则会引发一个错误。 乘法10000是从双精度值到int的临时转换,我们还不知道它的语法。 该规则旨在计算分配有许多组件的纸张的腰围值。 该规则抛出以下错误。 任何解释都会有帮助。

  • 我正在尝试实现drools决策表。当我实现我自己的示例代码时,我得到以下错误:java.lang.运行时异常:创建KieBase时出错。 Eclipse IDE控制台中可见的错误是: Java语言lang.RuntimeException:创建KieBase时出错[消息[id=1,KieBase=患者,级别=错误,路径=PatientDecisionTable.xls,行=10,列=0文本=[错误

  • 问题内容: 当前在WTForms中访问错误,您必须像这样遍历字段错误: 由于我正在构建一个不使用任何表单视图的rest应用程序,因此我不得不检查所有表单字段以查找错误所在。 有没有办法可以做类似的事情: 问题答案: 实际对象的属性包含字典中的字段名称及其错误。因此,您可以执行以下操作:

  • 我试图使用javamail示例包中的ShowMsg.java读取gmail消息,但在运行时不断出现此错误。虽然程序编译得很好。 以下是错误消息: 我运行的命令是,编译它的命令是。javax.mail.jar包含在lib文件夹中 这是一些更短的替代代码,并得到相同的错误:

  • 基于本教程,我使用Drools和Java创建了一个简单的项目。它运行完美,所以我根据我想做的进行了调整。我的DRL文件使用mvel方言(而不是Java方言),初始化发生在DRL文件中的规则“初始”中。你可以在这里看到这个项目(源代码以及库和DRL文件)。我的DRL文件看起来不像下面这样: 一切正常,但是第一行的包必须是,尽管所有的类都在包中。当我将包名更改为时,我得到以下错误: 现在有了所有的乐趣

  • 我在一个Java程序(在本例中是Optaplanner的变体)中有一个Drools文件,它是在NetBeans8上构建的。当我运行程序时,我会得到一条错误消息: 在Googles错误mesage之后,是从Optaplanner抛出的类路径资源。 我的问题是,由于没有关于错误在drools文件中的位置的进一步信息,调试这段代码的好方法是什么?有没有任何插件可以帮助我缩小问题的范围,就像Netbean