我的自定义注释是:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheClear {
long versionId() default 0;
}
我希望实现类似的功能,我可以将方法参数“versionTo”传递给我的自定义注释。
@CacheClear(versionId = {versionTo})
public int importByVersionId(Long versionTo){
......
}
我该怎么办?
答案 0 :(得分:4)
不可能。
注释需要常量值,方法参数是动态的。
答案 1 :(得分:1)
您不能传递值,但是可以在Spring Expression
中传递该变量的路径,并使用 AOP的 JoinPoint
和Reflection
来获取和使用它。请参阅以下内容:
您的注释:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheClear {
String pathToVersionId() default 0;
}
注释用法:
@CacheClear(pathToVersionId = "[0]")
public int importByVersionId(Long versionTo){
......
}
方面类:
@Component
@Aspect
public class YourAspect {
@Before ("@annotation(cacheClear)")
public void preAuthorize(JoinPoint joinPoint, CacheClear cacheClear) {
Object[] args = joinPoint.getArgs();
ExpressionParser elParser = new SpelExpressionParser();
Expression expression = elParser.parseExpression(cacheClear.pathToVersionId());
Long versionId = (Long) expression.getValue(args);
// Do whatever you want to do with versionId
}
}
希望这可以帮助想要做类似事情的人。