首页 > 解决方案 > 如何使用 SpEL 设置注释字段以处理值

问题描述

我需要在带注释的接口中设置我的一些字段以接受 Spring 表达式语言定义。

我有一个工作代码,但我对此并不满意。看:

注解:

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Example {
    String id();
}

方面:

@Aspect
@Component
public class ExampleAspect {
    @Before("@annotation(com.example.annotation.Example)")
    public void beforeAdvice(JoinPoint joinPoint) {

        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Example p = signature.getMethod().getAnnotation(Example.class);
        long id = (Long) valueFromExpression(joinPoint, p.id());
        // .... work with ID
    }

    /**
     * Manually processed SpEL expression
     */
    private Object valueFromExpression(JoinPoint 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);
    }
}

用法:

@GetMapping("/test/{someId}")
@Example(id = "#someId")
public void example(@PathVariable Long someId) {
   // some code
}

这可行,但我想将注释属性的初始化定义为由 SpEL 自动处理并由我的 IDE 正确突出显示 - 没有方法valueFromExpression()

标签: javaspringspring-el

解决方案


关于 IDE 支持,请参阅 [@StéphaneNic​​oll] 的答案:https ://stackoverflow.com/a/33298418/3759414

“Intellij 中的支持是一样的。目前 Jetbrains 开发人员跟踪使用 SpEL 的位置并将其标记为 SpEL 支持。我们没有任何方法可以证明该值是实际的 SpEL 表达式(这是毕竟注释类型上的原始 java.lang.String)。”


推荐阅读