我的上下文是一個Java Optaplanner應用程序,它使用Drools進行分數計算(類似於optaplanner示例)。對於派生類,使用嵌套類進行Drools分數計算失敗
在基類和派生類拆分一些班後,我的分數計算得到一個錯誤:
Exception in thread "main" java.lang.IllegalStateException: There are errors in a score DRL:
Error Messages:
Message [id=1, kieBase=defaultKieBase, level=ERROR, path=de/.../Rules.drl, line=77, column=0
text=Unable to Analyse Expression var.type.prop2:
[Error: unable to resolve method using strict-mode: de...PropType.prop2]
訪問嵌套變量工作正常,在主Java代碼。
當第二級(class1.class2.param
)是派生類時,問題與Drools規則中嵌套變量的訪問有關。我試着去描述這個從我更復雜的代碼中提取一個小例子(我試圖保持它小,如果一個完整的小例子會更好,我可以嘗試把它擴大):
規劃實體:
@PlanningEntity
public class PlanningE{
// ...
@PlanningVariable(valueRangeProviderRefs = {"something"})
private SomePlanningVar var;
}
這將是規劃的變量:
public class SomePlanningVar{
private PropType type;
//getter, setter, constructor
}
}
終於在規劃變量使用的類,持有約值。 (請注意,PropTypeB
擴展PropType
):
public class PropType{
private Integer prop1;
//getter, setter, constructor
}
public class PropTypeB extends PropType{
private Integer prop2;
// getter setter constructor
}
設置僞代碼
...
PropTypeB prop = new PropTypeB(...)
SomePlanningVar pvar = new SomePlanningVar(prop)
...
問題Drools的規則是:
rule "prop"
when
PlanningE($value : var.type.prop2)
then
scoreHolder.addSoftConstraintMatch(kcontext, -$value);
end
此規則將正常工作時,我不拆PropType
在基類和派生類中(並且只需將prop2
添加到PropType
),但在我看來,這種繼承可能相當常見。
Drools似乎沒有看到派生類的正確簽名,儘管在Java代碼中這沒有問題。
我懷疑我在Java和/或Drools(具有強大的Python背景但對Java相對較新)中繼承的工作方式有問題,但現在我看不到什麼。
任何人有任何想法出了什麼問題?
PlanningE沒有一個稱爲proptype的屬性。我不知道如何通過類型PropType來訪問prop2。 - 向我們展示確切的Java代碼,其中「這個工作沒有問題」。 – laune
@laune是的,你有我。我試圖將一些代碼減少到一個小例子並搞砸了。我希望我糾正了這個例子中的錯誤。我有點不情願將此擴展到一個完整的工作示例,因爲這涉及到完整的optaplanner機制,但如果您認爲這將有助於我做到這一點。 –
Drools和OptaPlanner完全支持多態性。例如,OptaPlanner使用[這些類]進行單元測試(https://github.com/droolsjbpm/optaplanner/tree/master/optaplanner-core/src/test/java/org/optaplanner/core/impl/testdata/domain /擴展)。同樣,Drools也有測試(可能在MiscTest中)。因此,如果在這兩個項目中確實存在bug,請創建一個jira並提交一個包含失敗單元的拉取請求以重現問題。 –