使用Graal脚本引擎根据json字符串规则/条件验证json字符串

问题描述

我们从客户端获取传入消息和ruleInstructions作为json字符串, 我们正在使用jdk 11和Graal.js脚本引擎。

1:incomingMessage:

var header =
"{  
    \"devv1\":\"NULL\",\"devkp2\":\"val\",\"compression\":\"NULL\",\"subcode\":\"P_CODE\",\"code\":\"PEB_USER\",\"Client\":{
                \"first_name\":\"Perf FN 422677\",\"client_last_name\":\"DP_PSL\",\"clientid\":\"780A832\",\"email\":\"DP_PS@airb.com\"
               }
    \"clientsrc\":\"dev.client.notvalid\"
}"

2:规则作为json字符串(jsRuleInstructions)

"{
  \"validate\":\"header.code == 'PEB_USER' && header.subcode == 'P_CODE' && !(header.clientsrc.search('clt.test') >= 0 || header.clientsrc.search('clt.u-test') >= 0) ? 0 : -1\",\"AppValues\":
            [
                {\"key\":\"first_name\",\"included\":\"Y\"},{\"key\":\"last_name\",{\"key\":\"email_address\",]
}"

我们如何使用graal.js针对传入消息验证ruleInstructions

这是我当前代码的外观:

// Validates incomingMessage against jsRuleInstructions using graalvm
public static Map<String,String> process(String jsRuleInstructions,String incomingMessage)
{
        ObjectMapper mapper = new ObjectMapper();
        Map<String,Object> outputMap = null;
        try {
            outputMap = mapper.readValue(jsRuleInstructions,Map.class);
        } catch (JsonProcessingException e) {
            e.printstacktrace();
        }
        jsRuleInstructions= (String)outputMap.get("validate");
        String jsRulesArray[]= jsRuleInstructions.split("\\|\\|");
        ScriptEngine graalEngine = new ScriptEngineManager().getEngineByName("Graal.js");
        HashMap<String,String> validateMap = new HashMap<String,String>();

        try {
            graalEngine.eval("var header = jsRuleInstructions");
           
        } catch (ScriptException e) {
            e.printstacktrace();
        }
        for(int i=0;i< jsRulesArray.length;i++)
        {
            System.out.println("each condition :: "+jsRulesArray[i]);
            try {
                // This part is where I need help 
                Boolean eval = (Boolean) graalEngine.eval(jsRulesArray[i]);
                if(eval==true) {
                    validateMap.put("Validated",incomingMessage);
                    return validateMap;
                }
            } catch (ScriptException e) {
                e.printstacktrace();
            }
        }
        return null;
}

代码读取jsRuleInstructions,获取“验证”(这是条件或规则) 必须针对传入消息进行验证。

所以基本上,如果有来自jsRuleInstructions的任何条件:

1: header.code == 'PEB_USER' && header.subcode == 'P_CODE' && !(header.clientsrc.search('clt.test') >= 0 
or 
2: header.clientsrc.search('clt.u-test') >= 0) ? 0 : -1\

按住,然后将传入消息作为带有条目(“ validated”,incomingMessage)的映射返回,否则返回null。

如何使用graal脚本引擎实现所需的验证?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...