動作(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。

results matching ""

    No results matching ""