Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有动态参数的自定义注释_Java_Spring_Spring Annotations - Fatal编程技术网

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”注释来完成