Как оценить выражение SPeL в пользовательской аннотации

Я использую пользовательскую аннотацию для выполнения некоторой логики в аспекте. Я бы хотел, чтобы моя аннотация могла оценивать свойство вapplication.yaml. Вот что у меня есть на данный момент. Может ли кто-нибудь сказать мне, что я делаю неправильно, или указать мне правильное направление?

application.yaml

      app:
  name: my-application

MyAnno

      @Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
  String name() default "";
}

Пример службы

      @Service
public class ExampleService {
  // stuff...

  @MyAnno(name = "${app.name}")
  public void someMethod(){
    // logic
  }
}

МойАспект

      @Aspect
@Component
public class MyAspect {

  @Pointcut("@annotation(my.package.MyAnno)")
  public void annotatedMethods() {}

  @Around("annotatedMethods()")
  public Object doStuff(ProceedingJoinPoint joinPoint){
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();
    MyAnno myAnno = method.getAnnotation(MyAnno.class);
    String evaluatedExpression = valueFromExpression(joinPoint, myAnno.name());
  }

  private String valueFromExpression(ProceedingJoinPoint joinPoint, String expression) {
    ExpressionParser parser = new SpelExpressionParser();

    StandardEvaluationContext context = new StandardEvaluationContext();
    CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
    String[] parameterNames = codeSignature.getParameterNames();
    Object[] args = joinPoint.getArgs();

    for (int i = 0; i < parameterNames.length; i++) {
      context.setVariable(parameterNames[i], args[i]);
    }

    Expression exp = parser.parseExpression(expression);
    return exp.getValue(context, String.class);
  }
  
}

Ошибка

      Caused by: org.springframework.expression.spel.SpelParseException: EL1041E: After parsing a valid expression, there is still more data in the expression: 'lcurly({)'
    at org.springframework.expression.spel.standard.InternalSpelExpressionParser.doParseExpression(InternalSpelExpressionParser.java:135) ~[spring-expression-6.0.2.jar:6.0.2]
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:61) ~[spring-expression-6.0.2.jar:6.0.2]
    at org.springframework.expression.spel.standard.SpelExpressionParser.doParseExpression(SpelExpressionParser.java:33) ~[spring-expression-6.0.2.jar:6.0.2]
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:52) ~[spring-expression-6.0.2.jar:6.0.2]
    at org.springframework.expression.common.TemplateAwareExpressionParser.parseExpression(TemplateAwareExpressionParser.java:43) ~[spring-expression-6.0.2.jar:6.0.2]

0 ответов

Другие вопросы по тегам