问题描述
我们从客户端获取传入消息和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 (将#修改为@)