2016-08-16 2 views
0

Ich benutze Optaplanner 6.2Finale Version und alles funktioniert gut außer dem Operator stimmt. Um mehr zu erklären, das ist meine Regel.Drools Regel Betreiber passt funktioniert nicht in Optaplanner 6.2Final

rule "TEST REG EXP OPERATOR" 
when 
    $cheese:Cheese($cheese.type matches "(Buffulo)?\\S*Mozarella") 
then 
    scoreHolder.addSoftConstraintMatch(kcontext, 1); 
end 

Das Folgende ist die Ausnahme ausgelöst:

Exception in thread "main" [Error: unable to resolve method: com.app.test.domain.Cheese.$cheese() [arglength=0]] 
[Near : {... $cheese.type ~= "(Buffulo)?\\S*Mozarella" ....}] 

Hinweis: Wenn ich $ Käse entfernt. Erklärung vor Typ, hat die Regel kein Problem. Dies funktioniert gut:

$cheese:Cheese($cheese.type == "Buffulo") 

Alle Vorschläge würden wir uns freuen.

UPDATE: Es stellt sich heraus, dass die folgende Ausnahme nur auf der drools Core-Version 6.2.0.Final und 6.3.0.Final wirft, nachdem ich Überprüfung auf ganzer Version getan. Es funktioniert in den restlichen Versionen.

$cheese:Cheese($cheese.type matches "(Buffulo)?\\S*Mozarella") 
+0

Auch zu verwenden gewesen, wenn es nichts offensichtlich falsch mit Ihrem Code, mit einer Variablen auf dem Muster, das Sie sich gerade befinden eines seiner Attribute zuzugreifen, ist kein gemeinsames Muster (und ich don Ich sehe keinen Vorteil. Hast du das versucht? '$ Käse: Käse (Typ passt" (Buffulo)? \\ S * Mozarella ")' –

+0

Ja, es funktioniert, wenn ich $ Käse verwende: Käse (Typ passt "(Buffulo)? \\ S * Mozare lla"). Allerdings verstehe ich nicht, warum es nicht möglich ist, Variablen zu verwenden. Wie können wir die folgende Bedingung erreichen? $ cheese1: Käse (Typ passt "(Buffulo)? \\ S * Mozarella") $ cheese2: Käse ($ cheese1.name stimmt mit "A. *" überein, id> $ cheese1.id) –

+0

Wenn die 'name' Bedingung ist Wenn es um den ersten 'Cheese' geht, dann verschiebe es zum ersten Muster:' $ cheese1: Cheese (type matches "(Buffulo)? \\ SMozare lla", Name stimmt mit "A. *" überein) $ cheese2: Cheese (id > $ cheese1.id) ' –

Antwort

0

Wenn Sie diese Arbeit haben wollen:

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla") 
    $cheese2:Cheese($che‌​ese1.name matches "A.*", id>$cheese1.id) 

Sie Methode verwenden, haben Anrufe:

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla") 
    $cheese2:Cheese($che‌​ese1.getName() matches "A.*", id>$cheese1.getId()) 

Dies setzt voraus, Sie folgende Java Beans Konventionen wurden (wie Sie sollte). Aber viel besser wäre

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla", 
        name matches "A.*", $id1: id) 
    $cheese2:Cheese(id > $id1) 
+0

' $ cheese1: Käse (Typ passt "(Buffulo)? \\ SMozare lla") $ cheese2: Käse ($ che ese1.getName() stimmt mit "A. *" überein, id > $ cheese1.getId()) 'wirft die selbe Ausnahme tatsächlich. Vielleicht war meine Frage nicht klar. Die Frage war warum '$ Käse1: Käse ($ cheese1.type passt" (Buffulo)? \\ SMozare lla ")' wirft Ausnahme von der Verwendung von Variablen und warum das Folgende funktioniert gut? '$ cheese1: Cheese ($ cheese1.type ==" Buffulo ")' –

+0

Um das zu beantworten, sollten wir die Drools Version kennen und genauen (!) Code für die Klasse Cheese haben. Vielleicht fügst du das zu deiner Frage hinzu. - Aber das übliche Paradigma ist die Verwendung von Feldnamen ohne vorangehende Bindevariable und ohne Klammern, im Gegensatz zu einer Bindevariablen gefolgt von einem Punkt, dem Getter-Namen (!) Und einem Klammerpaar. – laune

+0

danke für die antwort. Nachdem ich andere drools Versionen überprüft habe, scheint es zu funktionieren. Also, weil ich 6.2.0.Finale Version verwende. Ich habe den Beitrag aktualisiert. –

Verwandte Themen