動作(zuò)庫文(wén)件
動作(zuò)庫文(wén)件的作(zuò)用(yòng)是對配置在spring中(zhōng)的bean方法進行映射,使得我們可(kě)以直接在規則當中(zhōng)調用(yòng)這些方法。同樣在項目的“庫”節點下創建一個動作(zuò)庫文(wén)件,可(kě)以看到動作(zuò)庫文(wén)件内容有(yǒu)三列,分(fēn)别是動作(zuò)名(míng)稱,bean的id定義列,方法名(míng)定義列,以及方法對應的參數定義列,如下图所示:
為(wèi)了演示這裏定義方法的具(jù)體(tǐ)操作(zuò),下面是一個名(míng)為(wèi)MethodTest的類源碼:
package rete.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.bstek.urule.model.ExposeAction;
/**
* @author Jacky.gao
* @since 2015年1月14日
*/
public class MethodTest {
@ExposeAction("helloKey")
public String hello(String username){
System.out.println("hello "+username);
return "hello"+username;
}
@ExposeAction("方法1")
public boolean evalTest(String username){
if(username==null){
return false;
}else if(username.equals("張三")){
return true;
}
return false;
}
@ExposeAction("測試Int")
public int testInt(int a,int b){
return a+b;
}
public int testInteger(Integer a,int b){
return a+b*10;
}
@ExposeAction("打印内容")
public void printContent(String username,Date birthday){
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(birthday!=null){
System.out.println(username+"今年已經"+sd.format(birthday)+"歲了!");
}else{
System.out.println("Hello "+username+"");
}
}
@ExposeAction("打印Member")
public void printUser(Member m){
System.out.println("Hello "+m.getUsername()+", has house:"+m.isHouse());
}
}
在這個MethodTest類中(zhōng),我們可(kě)以在動作(zuò)庫中(zhōng)需要引用(yòng)的方法上都添加了一個名(míng)為(wèi)ExposeAction的annotation,它的作(zuò)用(yòng)是在定義動作(zuò)庫時,可(kě)以通過這個annotation直接選擇對應的目标方法。同樣我們也看到對于需要在動作(zuò)庫中(zhōng)引用(yòng)的方法是不需要實現任何接口的,方法簽名(míng)也是任意的,接下來,我們需要将這個類配置到spring中(zhōng),讓其成為(wèi)一個标準的bean,spring中(zhōng)的配置如下:
<bean id="methodTest" class="rete.test.MethodTest"></bean>
定義動作(zuò)庫的Bean時,一定不要忘記給Bean定義一個Id,這樣才能(néng)保證規則在任何地方運行都不會出錯,這點很(hěn)關鍵。
回到動作(zuò)庫文(wén)件編輯器,點擊“添加動作(zuò)”按鈕,添加一條Bean定義信息,将"Spring BeanId"屬性值改為(wèi)我們這裏的“methodTest”,在當前行上點擊右鍵,在彈出的菜單中(zhōng)選擇“根據Spring BeanId選擇方法”,如果當前定義的Spring BeanId在當前環境中(zhōng)存在的話,那麽彈出 的窗口中(zhōng)會顯示出所有(yǒu)添加了ExposeAction的annotation的方法,我們可(kě)以根據選擇添加即可(kě),可(kě)以看到添加的方法會自動将這個方法所需要的參數加載進去,添加成功後,為(wèi)了在規則中(zhōng)更好的可(kě)讀性,我們可(kě)以修改“動作(zuò)名(míng)稱”、“方法名(míng)稱”以及“參數名(míng)稱”。
在動作(zuò)庫定義的時候需要注意,如果我們規則運行方式采用(yòng)的是客戶端服務(wù)器模式,那麽必須要保證調用(yòng)知識包的客戶端Spring環境裏有(yǒu)這個Bean,且Bean的Id要與動作(zuò)庫定義時的Id保證一至,否則調用(yòng)會出現錯誤。
變量庫、參數庫、動作(zuò)庫、常量庫這些庫文(wén)件定義好後,就可(kě)以在各種類型的規則文(wén)件中(zhōng)導入并使用(yòng)它們。
另外,需要注意的是:在定義動作(zuò)中(zhōng),入參是自定義業務(wù)對象,在調用(yòng)時發生argument type mismatch異常信息,需要将java方法的入參類型定義為(wèi)Object,在方法中(zhōng)通過instanceof判斷是否為(wèi)GeneralEntity。因為(wèi)在URule Pro中(zhōng)的業務(wù)對象,有(yǒu)兩種情況:
1.通過java代碼生成的,比如session.insert傳入的自定義java業務(wù)對象,在方法中(zhōng)獲取時,類型就是自定義Java業務(wù)對象類型。
2.規則編輯器中(zhōng)快速測試時,入參傳入的數據,在方法中(zhōng)獲取時,類型就是GeneralEntity。