我是Drools的新手。我正在创建一个规则,但我得到一个编译时错误
“字段不可见”。
我试图查看Jboss示例,他们使用方言“mvel”。它汇编了。我不懂方言。那么什么是dialect=mvel
?
答案 0 :(得分:11)
mvel
,或者MVFLEX Expression Language有一个rich syntax,其中许多允许比java
更简洁和富有表现力的代码(并且更少命令性),例如
get()
ters / set()
ters的简写(例如封装私有字段),以替代property
样式语法(类似于VB or C# properties in .Net)即。而不是
myObject.setSomeField("SomeValue");
int x = myObject.getSomeIntField();
您可以使用语法(请注意细微的大小写切换):
myObject.someField = "SomeValue"
x = myObject.someIntField // Type inferrence
return
语句是可选的(在Scala等许多函数语言中都有一种约定),分号也是如此,除非每行有多个语句:
x // i.e. return x;
foos = {2, 4, 6, 8, 10}
foos[3] // foos.get(3)
bars = ["a" : "Apple", "b" : "Basket"] // Hashmap, with put
bars["a"]
bars.a // Similar to dynamically typed object e.g. in javascript, if key is a string.
foo.?bar.baz // if (foo.bar != null) { return foo.bar.baz; } else { return null; }
答案 1 :(得分:4)
基于
Drools JBoss Rules 5.0开发人员指南
Dialect用于指定条件或结果中的任何代码表达式中的语法。默认值为Java。 Drools目前支持另一种名为mvel的方言。
具体来说,mvel是基于Java的应用程序的表达式语言。它基于Java语法。 more info about mvel
答案 2 :(得分:2)
rule "validate holiday"
dialect "mvel"
dialect "java"
when
$h1 : Holiday( month == "july" )
then
System.out.println($h1.name + ":" + $h1.month);
end
方言的目的" mvel"是指向普通旧Java对象(POJO)类的变量的Getter和Setter。考虑上面的例子,其中使用了Holiday类并且在圆括号内(括号)" month"用来。所以用帮助方言" mvel"变量"月"的getter和setter;可以访问。
Dialect" java"用于帮助我们在规则中编写Java代码。这有一个限制或特征。我们不能在"内部使用Java代码。规则的一部分,但我们可以在"然后"中使用Java代码。一部分。
我们还可以声明一个没有$符号的Reference变量$ h1。对此没有限制。将$符号放在变量之前的主要目的是标记POJO类和规则的变量之间的差异。
问候。
答案 3 :(得分:0)
如果您使用方言mvel-将解决您的错误。 否则,该变量的范围默认情况下是私有的,因此请使用默认的getter。 getField()。用yoru字段名替换“字段”。
您可以在Business Central的“数据对象”->“类”->“源”选项卡中查看该类的源代码。
答案 4 :(得分:-1)
我发现了一些事情。我与之共享.Drools支持Java或MVEL脚本语言。获取对象属性值。例如,Fibonacci有bean并具有多个属性,即序列
rule Recurse
salience 10
when
not ( Fibonacci ( sequence == 1 ) )
f : Fibonacci ( value == -1 )
then
insert( new Fibonacci( f.sequence - 1 ) );
System.out.println( "recurse for " + f.sequence ); end
我们需要检查if sequence == 1然后value是-1。序列值设置为Fibonacci对象。我们检查基于MVEL或java.MVEL的值是Java的超集。