Java引用js代碼實現高效動態機制

        一直想分享一段10年Java web開發過程中,最滿意一個軟件項目的設計與實現,但總是由於自己的懶惰,不愛整理而停止不前,今天終於心血來潮,決定總結分享這段經歷。

        面對互聯網科技時代,作爲一名高級軟件工程,要想在程序員的道路上一直走下去,那麼我們避免不了要開闊自己的腦洞,擁有新的設計理念,一個完美設計理念至少支撐一個產品線,一個壞的理念視乎只能支持一個功能點,未來互聯時代要想在軟件行業走的一直前行,那麼必須走產品路線,最好的產品是支持這一條產品線上的任何個性化需求的。

        我之前的項目,就是從產品的理念出發,要求實現一個支持所有個性需求的項目。我們之前做的產品是對賬。所謂對賬就是兩個文件之間中的各條記錄,按照記錄中唯一標識,對比金額,同時得到四種對賬結果記錄(金額一致,金額不一致,文件1多,文件2多)這四種結果。不同的對賬結果有不同自動處理。同時我們的產品理念是可以支持多個系統間的對賬,也就是說要支持不同格式的文件,不同的對賬策略,不需要修改代碼完成一個這樣的產品的設計與實現。經過調研很久,最終我們決定使用Java代碼引用js代碼。也就是說通過頁面配置js策略,然後利用對比文件的實現類解析js,實現超動態的產品效果。

        代碼實現如下:解析js

        public Reconciliation createReconciliation(AccCheckCfg accCheckCfg){
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
         try {
            engine.eval(accCheckCfg.getJsScript());
            Reconciliation dydzwj = new Reconciliation();//定義對應實體
            if (engine instanceof Invocable) {
                Invocable invEngine = (Invocable) engine;
                invEngine.invokeFunction("putParameters", null, dydzwj,-1);//將腳本中定義的內容複製到dydzwj對象中。
                return  dydzwj;
            }
        
         } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
         return null;
    }

js實例:

function putParameters(pojoInfo,recLog){
pojoInfo.setAutoProcess("01");
pojoInfo.setAutoEsbPath("");
pojoInfo.setTempletPath("");
pojoInfo.setXpath1("/message/body/bankCode");
pojoInfo.setValue1(recLog.getAccSysCode());
pojoInfo.setXpath2("/message/body/transDate");
pojoInfo.setValue2(recLog.getAccCheckTime());
pojoInfo.setXpath3("/message/body/transCode");
pojoInfo.setValue3(recLog.getDataRec1Key());
pojoInfo.setRetXpath1("/message/body/transCode");
pojoInfo.setRetXpath2("/message/body/temp1");
pojoInfo.setRetXpath3("/message/body/temp2");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章