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);
}
}