自定義故障觸發條件之Spring Expression Language(SpEL)多變量表達式執行例子
阿新 • • 發佈:2018-12-15
物聯網專案中需要處理使用者自定義的故障觸發條件,表示式可能千奇百怪,這就需要用到SpEL來處理使用者輸入的表示式了,網上的例子都是單個變數的賦值,對於實際的業務沒有任何意義。我這裡的例子是多個變數的輸入的表示式。希望對新手同學有用。
public void testAAA(){ ExpressionParser parser = new SpelExpressionParser(); EvaluationContext context = new StandardEvaluationContext(); context.setVariable("A", "haha"); String result1 = parser.parseExpression("#A").getValue(context, String.class);//haha String result2 = parser.parseExpression("{#A}").getValue(context, String.class);//haha try {//此行程式碼異常 String result3 = parser.parseExpression("#{#V1}").getValue(context, String.class); } catch (Exception e) { e.printStackTrace();//Unexpected token. Expected 'identifier' but was 'lcurly({)' } LOG.info("{},{}",result1,result2); } public void testBBB() { ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext evContext = new StandardEvaluationContext(); evContext.setVariable("A", 5); evContext.setVariable("B", 2); String expressionTemplate1 = "#{#A}+#{#B}< 2"; String expressionTemplate2 = "#{#A}+#{#B}> 2"; String result1 = parser.parseExpression(expressionTemplate1, new TemplateParserContext()).getValue(evContext,String.class); String result2 = parser.parseExpression(expressionTemplate2, new TemplateParserContext()).getValue(evContext,String.class); //下面這兩行程式碼會報異常, 只能獲取表示式字串,沒法繼續執行表示式 try { String result3 = parser.parseExpression(expressionTemplate1, new TemplateParserContext()).getValue(evContext,boolean.class).toString(); String result4 = parser.parseExpression(expressionTemplate2, new TemplateParserContext()).getValue(evContext,boolean.class).toString(); } catch (Exception e) { e.printStackTrace();//can not convert from java.lang.String to boolean } String value1 = parser.parseExpression(result1).getValue().toString();//false String value2 = parser.parseExpression(result2).getValue().toString();//true boolean value3 = parser.parseExpression(result1).getValue(boolean.class);//false boolean value4 = parser.parseExpression(result2).getValue(boolean.class);//true LOG.info("{},{}", result1,value1); LOG.info("{},{}", result2,value2); }