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

对于派生类,使用嵌套类计算Drools得分失败

程俊誉
2023-03-14
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)
...
rule "prop"
    when
        PlanningE($value : var.type.prop2)
    then
        scoreHolder.addSoftConstraintMatch(kcontext, -$value);
end

我怀疑继承在Java和/或Drools中的工作方式有问题(有很强的Python背景,但对Java来说相对较新),但目前我不知道是什么问题。

有人知道出什么问题了吗?

共有1个答案

佟阳飙
2023-03-14

其实这很简单。看到访问器

var.type.prop2

静态分析(这是编译器唯一能做的分析)检测var属于SomePlanningVar类,其类型属于PropType类。这没有一个名为prop2的属性-故事的结尾。

摆脱困境的方法之一是将prop2添加到父类中:

public class PropType{
    private Integer prop2;
    public Integer getProp2(){ return prop2; }
}
 类似资料:
  • 这篇文章建议添加一些事实类作为嵌套规则的一种方式。http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681 我想知道的是——有没有保证“年龄和性别女性”在“怀孕”之前执行,“怀孕”在“怀孕2”之前执行?据我所知,我的申请中总是这样。但是,它是记录在口水留档的某个地方,还是只是等待倒塌的纸牌屋?

  • 解决Optaplanner使用中的疑点。OptaPlanner使用以下分数计算类型:Drools分数计算或约束流分数计算。两种方法都支持分数的增量计算。分数增量计算的一个疑点: 演示: > 假设requiredCpuPowerTotal条件成立,则执行then逻辑,并添加硬分数,假设为-100。 null

  • 主要内容:Java11 嵌套类的示例,输出结果为Java 11 引入了嵌套类的概念,我们可以在类中声明一个类。这种类的嵌套允许在一个地方对要使用的类进行逻辑分组,使它们更具可读性和可维护性。嵌套类可以有四种类型 - 静态嵌套类 非静态嵌套类 本地类 匿名类 Java 11 还提供了嵌套的概念,以允许嵌套类的通信和验证。 Java11 嵌套类的示例 ApiTester.java 输出结果为  

  • 目标 了解如何定义嵌套类和何时适合使用它们 了解使用嵌套类的副作用 了解 new 运算符在嵌套类中的特殊用法 了解如何和何时使用静态内部类和匿名内部类 在何处使用嵌套类 顾名思义,嵌套类(或内部类) 是在一个类中定义的另一个类。 public class EnclosingClass { . . . public class NestedClass { . . . } } 像成

  • 我有一个应用程序,它由一个服务器组成,该服务器可以有多个两种类型的客户端,即用户客户端和设备客户端。为此,我有一个客户端基类的向量,我将在其中添加新客户端,因为它们连接到服务器。这是我所拥有的简化版本: 我有下面的UML表示: 我怀疑这张图是否代表了正确的意图。也许我对UML不是很有经验,这就足够了,但是我认为这个图没有清楚地描述服务器中的向量将包含用户和设备而不是客户端的事实。我不知道我是否需要

  • 每个类中的方法如下所示: }

  • 问题内容: 我有一个参数化的休眠dao,它执行基本的crud操作,并且当将参数化用作委托时,对给定的dao执行基本的crud操作。 我希望能够在运行时从T派生Class以便在Hibernate中创建条件查询,例如: 我知道: 不存在,但是有什么方法可以在运行时从T导出正确的Class对象吗? 我研究了泛型和反射,但没有提出合适的解决方案,也许我错过了一些东西。 谢谢。 问题答案: 您可以将Clas