java - 如何使用 SpEL 设置注释字段来处理值

标签 java spring spring-el

我需要在带注释的接口(interface)中设置一些字段以接受 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()

最佳答案

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

"The support in Intellij is the same thing. Currently Jetbrains devs track the places where SpEL is used and mark them for SpEL support. We don't have any way to conduct the fact that the value is an actual SpEL expression (this is a raw java.lang.String on the annotation type after all)."

关于java - 如何使用 SpEL 设置注释字段来处理值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755042/

相关文章:

java - 为什么 ImageIO.read() 与 Toolkit.getDefaultToolkit().getImage() 相比这么慢?

java - android.util.Pair 作为 HashMap 中的键

java - maven central 是否希望共享源 URL?

java - 在多个键之一上缓存逐出

java - 有条件 Thymeleaf#aggregates.sum

java - 抽象方法覆盖,在java中实现不同的返回类型

spring - 每次我对静态文件进行更改时,是否都必须构建 maven webapp 项目?

spring - 您如何在 Spring 容器之外使用 Spring Data JPA?

spring - 在运行时确定 Spring 版本

java - Spring Security @PreAuthorize 使用 SpEL 语言访问 Autowiring bean