java - 如何使用 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()
解决方案
关于 IDE 支持,请参阅 [@StéphaneNicoll] 的答案:https ://stackoverflow.com/a/33298418/3759414
“Intellij 中的支持是一样的。目前 Jetbrains 开发人员跟踪使用 SpEL 的位置并将其标记为 SpEL 支持。我们没有任何方法可以证明该值是实际的 SpEL 表达式(这是毕竟注释类型上的原始 java.lang.String)。”
推荐阅读
- python - 如何从 Python 中的 H2O model_performance 函数中保存阈值?
- apache - 尝试编写 rewriterule 时出现 502 代理错误
- spring-cloud - Spring Cloud 应用程序的优雅关闭
- r - R需要按每个值的百分比对排序列表进行子集化
- typescript - 解决 Typescript 和 F 有界多态性
- arrays - 将数组添加到现有的 csv 文件
- sql - Microsoft SQL Server:当同一票号存在重复记录时查询以获取单个记录
- angularjs - AngularJs - 嵌套的 ng-repeat
- java - 是否可以将 @JvmOverloads 添加到 Kotlin 中生成的 copy(...) 方法中?
- apache-spark - 要创建多少个 Spark Session?