2016-08-06 17 views
1

Ich habe ein einfaches Projekt mit Drools und Java basierend auf this tutorial erstellt. Es funktionierte perfekt, also passte ich es an, was ich machen wollte. Meine DRL-Dateien verwenden den mvel-Dialekt (anstelle des Java-Dialekts) und die Initialisierung erfolgt in der Regel "initial" innerhalb der DRL-Datei. Sie können dieses Projekt (Quellcode sowie Bibliotheken und DRL-Datei) here sehen. Meine DRL-Datei sieht mehr weniger wie folgt aus:Drools - Fehler beim Erstellen von Feldaccessor für TypeDeclaration

package omd 
dialect "mvel" 
declare ocenaKwalifikacji 
    value : Double 
end 
declare ocenaKandydata 
    value : Double 
end 
declare ocenaTestow 
    value : Double 
end 
declare ocenaRozmowy 
    value : Double 
end 

rule "ocenakandydata/1 " 
when 
$ocenaRozmowy : ocenaRozmowy(value==5.0000) 
$ocenaKwalifikacji : ocenaKwalifikacji(value==5.0000) 
$ocenaTestow : ocenaTestow(value==5.0000) 
then 
    insert(new ocenaKandydata (5.0000)) 
    System.out.println("ocenaKandydata setting to 5.0000)"); 
end 
rule "ocenakandydata/2 " 
when 
$ocenaRozmowy : ocenaRozmowy(value==5.0000) 
$ocenaKwalifikacji : ocenaKwalifikacji(value==4.0000) 
$ocenaTestow : ocenaTestow(value==5.0000) 
then 
    insert(new ocenaKandydata (5.0000)) 
    System.out.println("ocenaKandydata setting to 5.0000)"); 
end 

... 

rule "ocenakandydata/64 " 
when 
$ocenaRozmowy : ocenaRozmowy(value==2.0000) 
$ocenaKwalifikacji : ocenaKwalifikacji(value==2.0000) 
$ocenaTestow : ocenaTestow(value==2.0000) 
then 
    insert(new ocenaKandydata (2.0000)) 
    System.out.println("ocenaKandydata setting to 2.0000)"); 
end 

rule "initial" 
when 
then 
/*DATA*/ 
insert(new ocenaKwalifikacji(5.0)); 
    insert(new ocenaRozmowy(2.0)); 
    insert(new ocenaTestow(2.0)); 
end 

Alles funktioniert gut, aber das Paket in der ersten Zeile omd sein muss, obwohl alle Klassen in der com.sample Paket sind. Wenn ich den Paketnamen zu com.sample geändert, bekam ich folgende Fehlermeldung:

Error creating field accessors for TypeDeclaration 'ocenaKandydata' for type 'ocenaKandydata'. 

Und jetzt gibt es den ganzen Spaß ...

ich für Android ähnliches Projekt erstellt. Ich benutze den gleichen Code, aber die Bibliotheken kommen von another example (die vorherigen haben Klassen in Java. * Oder javax. * Pakete, die nicht während der Programmierung für Android erlaubt ist). Sie können dieses Projekt here sehen. Ich lege die psc-zatrudnienie-ocena_kandydata.drl Datei in den Smartphone-Speicher unter . Wenn das Paket in der DRL-Datei ist pl.me.drools2tp (das gleiche wie alle Klassen in Android App in platziert werden), erhalte ich folgende Fehler (ähnlich jenen, die oben):

Error creating field accessors for TypeDeclaration 'ocenaKwalifikacji' for type 'ocenaKwalifikacji' 
 
Error creating field accessors for TypeDeclaration 'ocenaKandydata' for type 'ocenaKandydata' 
 
Error creating field accessors for TypeDeclaration 'ocenaTestow' for type 'ocenaTestow' 
 
Error creating field accessors for TypeDeclaration 'ocenaRozmowy' for type 'ocenaRozmowy'

und wenn ich wechsle den Paketnamen in DRL-Datei zu etwas anderen, die Fehler sind wie folgt:

Class 'ocenaKwalifikacji' not found for type declaration of 'ocenaKwalifikacji' 
Class 'ocenaKandydata' not found for type declaration of 'ocenaKandydata' 
Class 'ocenaTestow' not found for type declaration of 'ocenaTestow' 
Class 'ocenaRozmowy' not found for type declaration of 'ocenaRozmowy' 

Könnte jemand mir einen Rat geben darüber? Was genau bedeutet "Feldzugriff für TypeDeclaration"? Alle Klassen, die in declare Teil der DRL-Datei erwähnt werden, sind auch in Java definiert, haben value Feld und beide Getter und Setter. Die Dekstop-Version verwendet Drools 5.3.0 (es gibt eine riesige Art von JAR-Dateien von http://download.jboss.org/drools/release/5.3.0.Final/, wie es auf der Website von TutorialsPoint gesagt wurde). Es gibt auch eine Frage, die mit meiner verbunden ist: Integration of Drools (Expert System) with Android Projects

Ich bin sehr dankbar für einige Hilfe, Tipps oder Beispiele.

Mit freundlichen Grüßen, Peter.

BTW Ich benutze IntelliJ und Android Studio.

Antwort

0

Sie mit Java-Klassen in com.sample und eine DRL-Datei im selben Paket nicht mit declare Aussagen im Widerspruch zu den Java-Klassen kompilieren.

Aus Ihrer Frage gehe ich davon aus, dass Sie die gleiche Duplizierung einer Klasse in DRL im Gegensatz oder Ergänzung zu einigen Java-Code deklariert haben.

Lassen Sie einfach alle Deklarationsanweisungen weg und bleiben Sie bei den Java-Klassen oder behalten Sie die Deklarationen und verschieben Sie die Java-Klassen in ein anderes Paket.

BTW: machen Sie Ihre Klassenfelder privat.

+0

So sieht die Sache so aus: – user3855877

+0

1. das Paket in der DRL-Datei ist pl.me.drools2tp und die 'ocenaXXX' Klassen sind im Paket pl.me.drools2tp; In der DRL-Datei gibt es 'declare' Definitionen. Dann bekomme ich ** Error creating field accessor ... ** 2. Wenn ich 'ocenaXXX' Klassen in 'pl.me.drools2tp.model' Paket verschiebe, bekomme ich das:' Class 'ocenaXXX' nicht für den Typ gefunden Deklaration von 'ocenaXXX' [DialectError message = 'Kompilierte Klassen können nicht verdrahtet werden, wahrscheinlich im Zusammenhang mit Kompilierungsfehlern: JavaDialect kann nicht verdrahtet werden]] – user3855877

+0

3. Wenn ich 'ocenaXXX' Klassen in das' pl.me.drools2tp' Paket lege und entferne 'declare'-Anweisungen aus der DRL-Datei (mit' pl.me.drools2tp' in der ersten Zeile), bekomme ich folgendes: 'Constraint kann nicht erstellt werden, da 'value' ungültig ist: [Rule name = 'ocenaKandydata/1 '] '(der Fehler tritt 3 mal für jede Regel auf) – user3855877