【util】SpEL条件表达式

在项目中需要使用el表达式,对map进行解析后,将这个map作为root对象进行el解析。

条件表达式

模板:参数名称==值,如果是字符那么值加单引号,譬如:age==88 || city=='福州'

假设有一个Map

Map<String, Object> param = new LinkedHashMap<>();
param.put("city", "福州");
param.put("age", 88);
  • 数值是否相等
age == 88
//复杂写法:#root['age']== 88
> 结果:true
  • 字符是否相等
city == '北京'
//复杂写法:#root['city']== '福州'
> 结果:true
  • 多值比较表达式
age==88 && city=='福州'
//复杂写法:#root['age']== 88 && #root['city']== '福州'
> 结果:true,因age是88

age==888 && city=='福州'
> 结果:false 

代码如下

  • 解析方式
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SpelUtil {
	/**
	 * spel解析器
	 */
	private static final SpelExpressionParser parser = new SpelExpressionParser();
	/**
	 * spel缓存
	 */
	private static final ConcurrentHashMap<String, Expression> expressionMap = new ConcurrentHashMap<>(256);

	/**
	 * 获取表达式值
	 *
	 * @param param
	 * @param elExpression #root['city']== '福州'  || city=='福州'
	 * @return
	 */
	public static Object getValue(Map<String, Object> param, String elExpression) {
		Expression expression = getExpression(elExpression);
		StandardEvaluationContext context = new StandardEvaluationContext(param);
		//关键:如果没有配置MapAccessor,那么只能用['c']['a']这种解析方式
		context.addPropertyAccessor(new MapAccessor());
		Object value = expression.getValue(context);
		return value;
	}

	/**
	 * 验证SpEL[不符合]
	 *
	 * @param param        参数
	 * @param elExpression 表达式
	 * @return
	 */
	public static boolean verifyNotSpEL(Map<String, Object> param, String elExpression) {
		return !verifySpEL(param, elExpression);
	}

	/**
	 * 验证SpEL[符合]
	 *
	 * @param param        参数
	 * @param elExpression 表达式
	 * @return
	 */
	public static boolean verifySpEL(Map<String, Object> param, String elExpression) {
		try {
			Object value = SpelUtil.getValue(param, elExpression);
			if (!(value instanceof Boolean)) {
				return false;
			}
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * 从缓存中获取spel编译表达式
	 *
	 * @return SpelExpression
	 */
	private static Expression getExpression(String el) {
		Expression expression = expressionMap.get(el);
		if (expression != null) {
			return expression;
		}
		return expressionMap.computeIfAbsent(el, k -> parser.parseRaw(el));
	}
}

  • 单元调试
package com;


import com.istrong.form.common.utils.SpelUtil;
import org.junit.Test;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;


public class Spel2UtilTest {
	@Test
	public void verifyGeoJson() {
		Map<String, Object> param = new LinkedHashMap<>();
		param.put("city", "");
		param.put("age", 88);

		String elExpression = "#root['city']== ''";
		elExpression = "#root['age']== 88";
		System.out.println(SpelUtil.getValue(param, elExpression));
		elExpression = "city==''";
		System.out.println(SpelUtil.getValue(param, elExpression));
		elExpression = "age==88 && city==''";
		System.out.println(SpelUtil.getValue(param, elExpression));
		elExpression = "#root['age']== 888 && #root['city']== ''";
		System.out.println(SpelUtil.getValue(param, elExpression));
	}
}

在这里插入图片描述

参考资料

官网 Spring Expression Language (SpEL)

SPEL解析JSON或MAP

玩转Spring中强大的spel表达式!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掘金者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值