Java 带有动态参数的自定义注释
我的问题是: 我有一个注解:Java 带有动态参数的自定义注释,java,spring,spring-annotations,Java,Spring,Spring Annotations,我的问题是: 我有一个注解: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface DummyAnnotation { String dummyParam1(); String dummyParam2(); } 我的服务是: @Component public class DummyService { @DummyAnnotation(dummyParam1="#otp",dummy
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DummyAnnotation {
String dummyParam1();
String dummyParam2();
}
我的服务是:
@Component
public class DummyService {
@DummyAnnotation(dummyParam1="#otp",dummyParam2="#transactionId")
public void dummy(String otp, String transactionId){
}
}
我的方面尝试验证这两个参数,如果验证未成功,则引发异常:
@Around(value = "@annotation(annotation)")
public Object verifyOtp(final ProceedingJoinPoint jointPoint, final DummyAnnotation annotation) throws Throwable {
String transactionId = annotation.dummyParam1();
String otp = annotation.dummyParam2();
Boolean otpValid = otpService.verify(transactionId, otp);
if (otpValid) {
return jointPoint.proceed();
}
else {
throw new AuthentificationForteException();
}
}
因为Spring EL不工作,而且在我的方面,我有一个
dummyAnnotation.dummyParam1()等于“#otp”,而不是参数字符串otp的值
提前谢谢 最后我找到了一个解决方案: 解决方案是实现一个特定的Spring表达式解析器。
我将这些声明添加到我的方面:
private ExpressionParser expressionParser = new SpelExpressionParser();
private ParserContext parserContext = new TemplateParserContext();
我改变了检索dummyValue的方式:
@Around(value = "@annotation(annotation)")
public Object verifyOtp(final ProceedingJoinPoint jointPoint, final DummyAnnotation annotation) throws Throwable {
String transactionId = getDummyValue(annotation.dummyParam1(),jointPoint.getArgs());
String otp = getDummyValue(annotation.dummyParam2(),jointPoint.getArgs());
Boolean otpValid = otpService.verify(transactionId, otp);
if (otpValid) {
return jointPoint.proceed();
}
else {
throw new AuthentificationForteException();
}
}
getDummyValue是解析表达式的方法:
private String getDummyValue(String authExpression, Object[] args){
Expression expression = expressionParser.parseExpression(authExpression, parserContext);
String value = expression.getValue(new RootObject(args),String.class);
return value;
}
private static class TemplateparserContext implements ParserContext{
@Override
public boolean isTemplate() {
return true;
}
@Override
public String getExpressionPrefix() {
return "#{";
}
@Override
public String getExpressionSuffix() {
return "}";
}
}
protected static class RootObject {
private final Object[] args;
private RootObject(Object[] args) {
super();
this.args = args;
}
public Object[] getArgs() {
return args;
}
}
最后,我将我的服务和DummyAnnotation的使用用于:
@Component
public class DummyService {
@DummyAnnotation(dummyParam1="#{args[0]}",dummyParam2="#{args[1]}")
public void dummy(String otp, String transactionId){
}
}
编写一个与此相反的方面不是更简单吗
@DummyAnnotation
public void dummy(@Otp String otp, @TransactionId String transactionId){
...
}
它也不是特定于Spring的,因此更易于测试
(如果您打算遍历参数以提取OTP或TX ID,例如#foo.txId,那么这当然不起作用,但我认为它更简单。)我不太明白您使用此自定义注释想要实现什么,它没有任何验证器。你提到的方面是什么。请提供更多详细信息。我使用aspectI的代码编辑我的帖子,我同意,但我需要遍历对象,所以我不知道如何使用“@Otp”和“@Transactionid”注释来完成