【问题标题】:This annotation is not applicable to target 'local variable此注释不适用于目标'局部变量
【发布时间】:2021-06-10 23:54:53
【问题描述】:

我想从application.yml中获取值,但是这部分我得到了“This annotation is not applicable to target 'local variable”,如何解决这个问题?

@Value("\${aws.secretsManager.secretName}")
val secretName: String? = ""

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties

fun getSecret() {

        @Value("\${aws.secretsManager.secretName}")
        val secretName: String? = ""


        val region = "us-west-2"
        val logger: Logger = LoggerFactory.getLogger(GetSecretConfig::class.java)

        // Create a Secrets Manager client
        val client = AWSSecretsManagerClientBuilder.standard().withRegion(region).build()
        val getSecretValueRequest = GetSecretValueRequest().withSecretId(secretName)

        var getSecretValueResult: GetSecretValueResult? = try {
            client.getSecretValue(getSecretValueRequest)
        } 
}

application.yml

aws:
  secretsManager:
    secretName: "test-mvp"
    region: "us-west-2"
    user: "root"
    password: "root"

【问题讨论】:

    标签: spring spring-boot spring-mvc kotlin


    【解决方案1】:

    这里的解决方法逻辑:

    (尽管使用 Java 8 - 无论如何都不重要)

    像这样创建一个带有@Configuration注解的配置类:

    @Configuration
    public class ApplicationSecretsConfig {
    
        public ApplicationSecretsConfig(){}
    
        @Value("${aws.secretsManager.secretName}")
        private String secretName;
    
        public String getSecretName(){
          return secretName;
        }
    }
    

    然后在您的类中,自动装配 SecretsConfig 依赖项并使用其 getter 获取 secretName 的值。

    // class initialization done here
    
    ...
    @Autowired
    ApplicationSecretsConfig applicationSecretsConfig
    
    public String getSecret() {
        
    String secret = applicationSecretsConfig.getSecretName();
        
        // continue your logic
        ...
    }
    

    希望对某人有所帮助。

    【讨论】:

      【解决方案2】:

      来自@Valuejavadoc

      字段或方法/构造函数参数级别使用的注释,指示被注释元素的默认值表达式。

      @Value注解定义如下:

      @Target(value = {FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})
      @Retention(value = RUNTIME)
      @Documented
      public @interface Value
      

      正如您在@Target 中看到的那样,@Value 注释不打算在LOCAL_VARIABLE 中使用。

      解决方案是在函数外部定义secretName 变量 - 作为类的字段。

      【讨论】:

        猜你喜欢
        • 2014-10-02
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        相关资源
        最近更新 更多