Как оценить выражение 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]