【问题标题】:Spring: Injecting property as a value into an annotationSpring:将属性作为值注入注释
【发布时间】:2015-07-03 08:59:13
【问题描述】:

我正在尝试将值注入自定义注释,但 Spring 似乎没有进行评估。

这是我的注释:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnno {
    String var1();
    String var2();
}

这是我的带有注释的 Bean(它是在 Spring 配置文件中创建的):

public class MyClass {

    @MyCustomAnno(var1 = "${some.property.one}",
                  var2 = "${some.property.two}")
    public void someMethod() {
    // do something here
    }
}

这是我尝试使用传递到注释中的值的方面:

@Aspect
public class MyAop {

    @Around(value="@annotation(myCustomAnno)",argNames="myCustomAnno")
    public Object aroundMethod(MyCustomAnno myCustomAnno) {
        int intVar1 = Integer.parseInt(myCustomAnno.var1());
        int intVar2 = Integer.parseInt(myCustomAnno.var2());

        // ....
    }
}

在 around 方法中,我收到 NumberFormatException:对于输入字符串:${some.property.one}。这意味着 Spring 出于某种原因没有注入该值。

如果您想知道,在同一个类中,我可以执行正常的 @Value 注释,并且值会被正确注入:

@Value("${some.property.one}")
private propertyOne;            // This works

是否可以做我想做的事,如果可以,怎么做?

【问题讨论】:

    标签: spring dependency-injection annotations spring-aop


    【解决方案1】:

    AFAIK,占位符未在自定义注释中解析。但是,您可以在 Aspect 本身中解决它们。

    例如:

    @Aspect
    class MyAop implements EmbeddedValueResolverAware {
    
        private StringValueResolver resolver;
    
        @Around(value="@annotation(myCustomAnno)",argNames="myCustomAnno")
        public void play(MyCustomAnno ann) {
            System.out.println(resolver.resolveStringValue(ann.var1()));
        }
    
        @Override
        public void setEmbeddedValueResolver(StringValueResolver resolver) {
            this.resolver = resolver;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2022-06-22
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多