spel

spel 表达式解析

Posted by lijian on April 12, 2020

用法

StandardEvaluationContext context = SpelUtils.getContext(method,args);
Boolean frozen = SpelUtils.getContextValue(context,"#request.frozen",Boolean.class);

代码


import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * spel 表达式帮助类,一般情况,通过 aop 拦截获取到 method && args[] , 从而可以获取到 参数上下文, 再根据参数上下文就可以获取到对应的 spel 表达式的参数值
 *
 * @author lijian@jovision.com
 * @date 2020/10/15
 **/
@Slf4j
@UtilityClass
public class SpelUtils {

    /**
     * SpEL表达式parser
     */
    private static final SpelExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
    /**
     * 获取方法参数定义
     */
    private static final LocalVariableTableParameterNameDiscoverer NAME_DISCOVERER = new LocalVariableTableParameterNameDiscoverer();

    /**
     * 获取参数上下文
     */
    public StandardEvaluationContext getContext(Method method, Object[] args) {
        StandardEvaluationContext context = new StandardEvaluationContext();
        if (Objects.nonNull(args) && args.length > 0) {
            String[] paraNameArr = NAME_DISCOVERER.getParameterNames(method);
            if (Objects.nonNull(paraNameArr)) {
                for (int i = 0; i < paraNameArr.length; i++) {
                    context.setVariable(paraNameArr[i], args[i]);
                }
            }
        }
        return context;
    }

    /**
     * 获取上下文参数
     *
     * @param spelExpression spel 表达式 eq:#{userSaveDto.userId}
     */
    public <T> T getContextValue(StandardEvaluationContext context, String spelExpression, Class<T> clazz) {
        return EXPRESSION_PARSER.parseExpression(spelExpression).getValue(context, clazz);
    }

    /**
     * 更新上下文参数
     *
     * @param spelExpression spel 表达式 eq:#{userSaveDto.userId}
     */
    public void updateContextValue(StandardEvaluationContext context, String spelExpression, Object value) {
        EXPRESSION_PARSER.parseExpression(spelExpression).setValue(context, value);
    }
}