動作(zuò)庫文件
動作(zuò)庫文件的作(zuò)用是對配置在spring中的bean方法進行(xíng)映射,使得(de)我們可(kě)以直接在規則當中調用這些(xiē)方法。同樣在項目的“庫”節點下創建一個(gè)動作(zuò)庫文件,可(kě)以看到動作(zuò)庫文件內(nèi)容有(yǒu)三列,分别是動作(zuò)名稱,bean的id定義列,方法名定義列,以及方法對應的參數(shù)定義列,如下圖所示:
為(wèi)了演示這裏定義方法的具體(tǐ)操作(zuò),下面是一個(gè)名為(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("打印內(nèi)容")
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());
}
}
在這個(gè)MethodTest類中,我們可(kě)以在動作(zuò)庫中需要引用的方法上(shàng)都添加了一個(gè)名為(wèi)ExposeAction的annotation,它的作(zuò)用是在定義動作(zuò)庫時(shí),可(kě)以通(tōng)過這個(gè)annotation直接選擇對應的目标方法。同樣我們也看到對于需要在動作(zuò)庫中引用的方法是不需要實現任何接口的,方法簽名也是任意的,接下來(lái),我們需要将這個(gè)類配置到spring中,讓其成為(wèi)一個(gè)标準的bean,spring中的配置如下:
<bean id="methodTest" class="rete.test.MethodTest"></bean>
定義動作(zuò)庫的Bean時(shí),一定不要忘記給Bean定義一個(gè)Id,這樣才能保證規則在任何地方運行(xíng)都不會(huì)出錯,這點很(hěn)關鍵。
回到動作(zuò)庫文件編輯器(qì),點擊“添加動作(zuò)”按鈕,添加一條Bean定義信息,将"Spring BeanId"屬性值改為(wèi)我們這裏的“methodTest”,在當前行(xíng)上(shàng)點擊右鍵,在彈出的菜單中選擇“根據Spring BeanId選擇方法”,如果當前定義的Spring BeanId在當前環境中存在的話(huà),那(nà)麽彈出 的窗口中會(huì)顯示出所有(yǒu)添加了ExposeAction的annotation的方法,我們可(kě)以根據選擇添加即可(kě),可(kě)以看到添加的方法會(huì)自動将這個(gè)方法所需要的參數(shù)加載進去,添加成功後,為(wèi)了在規則中更好的可(kě)讀性,我們可(kě)以修改“動作(zuò)名稱”、“方法名稱”以及“參數(shù)名稱”。
在動作(zuò)庫定義的時(shí)候需要注意,如果我們規則運行(xíng)方式采用的是客戶端服務器(qì)模式,那(nà)麽必須要保證調用知識包的客戶端Spring環境裏有(yǒu)這個(gè)Bean,且Bean的Id要與動作(zuò)庫定義時(shí)的Id保證一至,否則調用會(huì)出現錯誤。
變量庫、參數(shù)庫、動作(zuò)庫、常量庫這些(xiē)庫文件定義好後,就可(kě)以在各種類型的規則文件中導入并使用它們。
另外,需要注意的是:在定義動作(zuò)中,入參是自定義業務對象,在調用時(shí)發生(shēng)argument type mismatch異常信息,需要将java方法的入參類型定義為(wèi)Object,在方法中通(tōng)過instanceof判斷是否為(wèi)GeneralEntity。因為(wèi)在URule Pro中的業務對象,有(yǒu)兩種情況:
1.通(tōng)過java代碼生(shēng)成的,比如session.insert傳入的自定義java業務對象,在方法中獲取時(shí),類型就是自定義Java業務對象類型。
2.規則編輯器(qì)中快速測試時(shí),入參傳入的數(shù)據,在方法中獲取時(shí),類型就是GeneralEntity。