Java Drools未按预期工作。规则不适用

Java Drools未按预期工作。规则不适用,java,drools,Java,Drools,工作内存中只有订单,没有产品,因此不会触发规则。只有当左侧的所有条件(“when”子句)匹配时,才会触发该规则 以下规则应更符合您的期望: dialect "mvel" rule "Applying taxes to imported products." when // Take the order from working memory and get the product list from it $order: Order( $products: products != n

工作内存中只有
订单
,没有
产品
,因此不会触发规则。只有当左侧的所有条件(“when”子句)匹配时,才会触发该规则

以下规则应更符合您的期望:

dialect "mvel"

rule "Applying taxes to imported products."
when

  // Take the order from working memory and get the product list from it
  $order: Order( $products: products != null )

  // Get only the imported products
  $product: Product( isImported == true ) from $products
then
  $product.setSale_tax($product.getPrize() * (5d/100));  
  $order.setTotalPrize($product.getSale_tax() + $product.getPrize());
  $order.setTotalTaxes($product.getSale_tax());
  System.out.println($order.toString());
  System.out.println($order.getTotalPrize()); 
  System.out.println($order.getTotalTaxes());
end
我们要做的第一件事是从订单中获取产品列表,并将其别名为
$products
。然后我们从该列表中获取导入的产品——注意$products中的

在你的原始版本中,你只是调用了
$product:product(…)
,上面写着“从工作记忆中给我一个类似这样的产品。因为你的工作记忆中没有任何东西,所以它不起作用


(另外,您从订单中获取
$products
的方式有点不确定……不确定您在那里尝试做什么。)

您在工作内存中只有一个订单,没有产品,因此LHS上的这一行永远不会触发:
$product:product($products.isImported())
谢谢冷冻豌豆的Roddy,我想我是在使用以下部件处理它:when$order:order()$products:Product()from$order.getProducts()$products:Product($products.isImported())为了实现您的建议,我应该修改什么?嗨,Roddy,谢谢您的帮助,我得到了这个异常:您的产品类需要一个返回布尔值的
getIsImported
方法。
Obj(foo==“bar”)
语法将嗅出前缀为“get”的getter,因此它将获得调用getFoo()的foo值。谢谢你,Roddy,异常被排除了,但是测试还没有工作,因为我必须应用另一个规则,这取决于另一个变量,乘积中的另一个布尔值,isTax_emption。真正的规则可以是这些布尔值的任意组合,你建议创建四个规则,还是在同一个规则中,应用这四个可能性?四个规则是打赌基本上,如果你发现自己在右手边写“如果”语句,这通常意味着你应该写多条规则。