2015-04-23 2 views
0

Я пробовал очень простое правило проверить, работает ли слюни, я связал его с спящим режимом, но обнаружил ошибку «java.lang.ArrayIndexOutOfBoundsException: -1» это основной: пакет род деятельности;Drools Error with readKnowledgebase

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; 
    } 

ответ

0

Никогда не вызывать 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 вы используете? И определение класса Reseau было бы необходимо для воспроизведения ошибки.

Ошибки в старых версиях версии 5.x не могут быть исправлены. Попробуйте 6.2.

+0

Я использую Drools 5.4.0, я добавил определение класса Reseau в сообщение. Благодарим вас за помощь. – balance

+0

Я не могу воспроизвести это, даже с 5.4.0. Но я не собираюсь из Eclipse. Попробуйте в оболочке, используя этот путь к классам: 'root =/extra/drools-distribution-5.4.0.Final/binaries;' tag = 5.4.0.Final; '' export CLASSPATH =.: $ Root/drools-core- $ {метка} .jar: $ корень/знания апи - $ {метка} .jar: $ корень/знания внутреннего апи - $ {метка} .jar: $ корневой/Drools-составитель - $ {метка} .jar : $ корень/ANTLR-2.7.7.jar: $ корневой/ANTLR-3.3.jar: $ корневой/ANTLR-среда-3.3.jar: $ корневой/СЕС-3.5.1.jar: $ корневой/mvel2-2.1. 0.drools16.jar: /extra/quartz-1.8.3/quartz-1.8.3.jar: $ ROOT/Drools-decisiontables - $ {метка} .jar: $ ROOT/Drools-шаблоны - $ {метка} .jar : $ root/jxl-2.6.10.jar' – laune

+0

Я обновил до Drools 6.2, как вы рекомендовали, но проблема сохранилась, поэтому я открыл новый проект Drools и скопировал все, ошибка больше не появляется, но есть ничего не отображается. PS: когда я выполняю правило, не используя спящий режим, он работает, и когда я не использую Drools и просто печатаю объекты из Hibernate, он работает тоже, но ничего не отображается, когда я совмещаю оба. В чем проблема? ? Я действительно не могу понять, что – balance