Drools - 如何比较列表中存在的 Java 对象中存在的字符串值
Drools - how do I compare a string value present in a Java Object which is present inside a List
我是 Drools 的新手,在编写规则时遇到困难
这是我的数据结构:
public class Premium{
private List<InsuranceType> insuranceTypes;
}
public class InsuranceType {
private String name;
}
因此 Premium 对象将包含一个保险类型列表,我需要检查是否有任何保险类型的名称为“TPD”
已尝试以下方法:
rule "rule#3"
when
$fact:Premium($insuranceTypes : InsuranceType(name == 'TPD'))
then
System.out.println("Error");
end
但是应用服务器无法启动并出现以下错误:
2021-11-30 12:16:37.004 ERROR 23500 --- [ main]
o.d.c.k.builder.impl.AbstractKieModule : Unable to build KieBaseModel:defaultKieBase
Unable to Analyse Expression InsuranceType(name == "TPD"):
[Error: unable to resolve method using strict-mode: com.xyz.Premium.name()]
[Near : {... InsuranceType(name == "TPD") ....}]
^
[Line: 29, Column: 5] : [Rule name='rule#3']
Unable to analyze expression 'InsuranceType(name == "TPD")' : [Rule name='rule#3']
Field Reader does not exist for declaration '$insuranceTypes' in '$insuranceTypes :
InsuranceType(name == "TPD")' in the rule 'rule#3' : [Rule name='rule#3']
我假设 InsuranceType class 上有一个 public getName
方法,Premium [上有一个 public getInsuranceTypes
方法 class。如果其中任何一个不正确,您需要添加吸气剂或使这些属性 public.
您的规则非常接近。但是,您遇到的问题是 insuranceTypes
是一个列表,但您将其视为一个对象。
这里有多种选择,具体取决于您的需要。但是我会选择最简单的,就是这样:
rule "Example"
when
Premium( $insuranceTypes: insuranceTypes )
exists( InsuranceType( name == "TPD" ) from $insuranceTypes )
then
System.out.println("Error");
end
在第一行中,我获取保险类型并将它们分配给变量$insuranceTypes
。此变量现在是类型列表。
然后在第二行,我断言列表中至少存在一个名为“TPD”的 InsuranceType。
请注意,Drools 还有一个 memberOf
运算符和一个 contains
运算符,这在处理列表和其他可迭代集合时很有用。这些是彼此的倒数,例如。你会 Example( foo memberOf $someList )
或 Example( myList contains $something )
.
我是 Drools 的新手,在编写规则时遇到困难 这是我的数据结构:
public class Premium{
private List<InsuranceType> insuranceTypes;
}
public class InsuranceType {
private String name;
}
因此 Premium 对象将包含一个保险类型列表,我需要检查是否有任何保险类型的名称为“TPD”
已尝试以下方法:
rule "rule#3"
when
$fact:Premium($insuranceTypes : InsuranceType(name == 'TPD'))
then
System.out.println("Error");
end
但是应用服务器无法启动并出现以下错误:
2021-11-30 12:16:37.004 ERROR 23500 --- [ main]
o.d.c.k.builder.impl.AbstractKieModule : Unable to build KieBaseModel:defaultKieBase
Unable to Analyse Expression InsuranceType(name == "TPD"):
[Error: unable to resolve method using strict-mode: com.xyz.Premium.name()]
[Near : {... InsuranceType(name == "TPD") ....}]
^
[Line: 29, Column: 5] : [Rule name='rule#3']
Unable to analyze expression 'InsuranceType(name == "TPD")' : [Rule name='rule#3']
Field Reader does not exist for declaration '$insuranceTypes' in '$insuranceTypes :
InsuranceType(name == "TPD")' in the rule 'rule#3' : [Rule name='rule#3']
我假设 InsuranceType class 上有一个 public getName
方法,Premium [上有一个 public getInsuranceTypes
方法 class。如果其中任何一个不正确,您需要添加吸气剂或使这些属性 public.
您的规则非常接近。但是,您遇到的问题是 insuranceTypes
是一个列表,但您将其视为一个对象。
这里有多种选择,具体取决于您的需要。但是我会选择最简单的,就是这样:
rule "Example"
when
Premium( $insuranceTypes: insuranceTypes )
exists( InsuranceType( name == "TPD" ) from $insuranceTypes )
then
System.out.println("Error");
end
在第一行中,我获取保险类型并将它们分配给变量$insuranceTypes
。此变量现在是类型列表。
然后在第二行,我断言列表中至少存在一个名为“TPD”的 InsuranceType。
请注意,Drools 还有一个 memberOf
运算符和一个 contains
运算符,这在处理列表和其他可迭代集合时很有用。这些是彼此的倒数,例如。你会 Example( foo memberOf $someList )
或 Example( myList contains $something )
.