SpringExpressionUtils.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package cn.iocoder.dashboard.util.sping;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.map.MapUtil;
  4. import cn.hutool.core.util.ArrayUtil;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.reflect.MethodSignature;
  7. import org.springframework.core.DefaultParameterNameDiscoverer;
  8. import org.springframework.core.ParameterNameDiscoverer;
  9. import org.springframework.expression.EvaluationContext;
  10. import org.springframework.expression.ExpressionParser;
  11. import org.springframework.expression.spel.standard.SpelExpressionParser;
  12. import org.springframework.expression.spel.support.StandardEvaluationContext;
  13. import java.lang.reflect.Method;
  14. import java.util.Collections;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * Spring EL 表达式的工具类
  19. *
  20. * @author mashu
  21. */
  22. public class SpringExpressionUtils {
  23. private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
  24. private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer();
  25. private SpringExpressionUtils() {
  26. }
  27. /**
  28. * 从切面中,单个解析 EL 表达式的结果
  29. *
  30. * @param joinPoint 切面点
  31. * @param expressionString EL 表达式数组
  32. * @return 执行界面
  33. */
  34. public static Object parseExpression(ProceedingJoinPoint joinPoint, String expressionString) {
  35. Map<String, Object> result = parseExpressions(joinPoint, Collections.singletonList(expressionString));
  36. return result.get(expressionString);
  37. }
  38. /**
  39. * 从切面中,批量解析 EL 表达式的结果
  40. *
  41. * @param joinPoint 切面点
  42. * @param expressionStrings EL 表达式数组
  43. * @return 结果,key 为表达式,value 为对应值
  44. */
  45. public static Map<String, Object> parseExpressions(ProceedingJoinPoint joinPoint, List<String> expressionStrings) {
  46. // 如果为空,则不进行解析
  47. if (CollUtil.isEmpty(expressionStrings)) {
  48. return MapUtil.newHashMap();
  49. }
  50. // 第一步,构建解析的上下文 EvaluationContext
  51. // 通过 joinPoint 获取被注解方法
  52. MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
  53. Method method = methodSignature.getMethod();
  54. // 使用 spring 的 ParameterNameDiscoverer 获取方法形参名数组
  55. String[] paramNames = PARAMETER_NAME_DISCOVERER.getParameterNames(method);
  56. // Spring 的表达式上下文对象
  57. EvaluationContext context = new StandardEvaluationContext();
  58. // 给上下文赋值
  59. if (ArrayUtil.isNotEmpty(paramNames)) {
  60. Object[] args = joinPoint.getArgs();
  61. for (int i = 0; i < paramNames.length; i++) {
  62. context.setVariable(paramNames[i], args[i]);
  63. }
  64. }
  65. // 第二步,逐个参数解析
  66. Map<String, Object> result = MapUtil.newHashMap(expressionStrings.size(), true);
  67. expressionStrings.forEach(key -> {
  68. Object value = EXPRESSION_PARSER.parseExpression(key).getValue(context);
  69. result.put(key, value);
  70. });
  71. return result;
  72. }
  73. }