使用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脚本引擎实现所需的验证?

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

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1486584.html

大家都在问