簡體   English   中英

Spring Boot @Value 注解從 application.properties 中獲取密鑰,但在運行時不使用它

[英]Spring Boot @Value annotation picks up key from application.properties, but does not use it at run time

@Value 的價值市場在運行時沒有通過。 我的代碼如下所示:

import com.example.MyClass;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    @Value("${api.key}")
    private String apiKey;

@Bean
public MyClass getKey() {

    return new MyClass(apiKey);

}

}

當我 hover 我的鼠標懸停在 IntelliJ 中的 ${api.key} 上時,它會顯示密鑰。 而且,如果我將 ${api.key} 替換為密鑰本身,則一切正常。 所以 IDE 知道 ${api.key} 是來自 application.properties 的鍵,但是在運行時,它不使用它,並且我收到 401 錯誤(因為該字段為空)。 即使我 go 到 application.properties 並在 api.key 上使用“查找用法”,它也會在代碼中顯示使用它的正確位置。

如果我運行 mvn spring-boot:run,一切都會像它應該的那樣完美執行,除了 api-key 是 null。 如果我將密鑰寫為字符串而不是使用@Value,它會讀取它並且一切都按預期工作。 盡管 Spring Boot 在其他所有方面都有效,但似乎集中在 @Value 未通過。

我已經用盡了我在網上找到的所有建議,但沒有任何效果。 很難列出我所做的所有嘗試,但我已經嘗試了我所看到的一切。 配置 pom、項目結構、運行配置、添加 @PropertySource、設置等。 我什至從頭開始創建了整個項目,以查看在我嘗試解決問題時是否有問題。

它識別屬性,運行 Spring,識別密鑰,但只是不使用它。

我遇到了類似的問題。 我發現您可以在 setter 上使用 @Value 注釋。 這應該有效:

private String apiKey;
@Value("${api.key}")
    public String setApiKey(String apiKey) {
        this.apiKey = apiKey;
    }

我不能解釋為什么或如何工作,所以如果有人有任何進一步的解釋,請隨時編輯我的答案。

嘗試以下方法:


@Configuration
public class MyConfig {
    
   @Bean
   public MyClass getKey(@Value("${api.key}") String apiKey) {
       return new MyClass(apiKey);
   }
}

另一個(甚至更好)的選擇是使用配置屬性:

@ConfigurationProperties(prefix="api")
public class ApiConfigProperties {
   private String key;
   // getters, setters, no-op constructor
}

@Configuration
@EnableConfigurationProperties(ApiConfigProperties.class)
public class MyConfig {
    
  @Bean 
  public MyClass getKey(ApiConfigProperties config) {
      return new MyClass(config.getKey()); 
  } 

}

我通常更喜歡第二種方法,因為它允許(使用插件)生成 IDE 可以讀取並支持自動完成的“特殊” JSON 文件。 另一個好處是第二種方法很容易調試(在設置器中放置一個斷點 - 再簡單不過了)並允許在一個地方指定默認值。

至於問題中建議的選項,我通常將@Configuration視為創建 bean 的 DSL,因此我不會在其上維護任何 state。 由於 Configuration 恰好是一個 spring bean,它允許自動布線,但這並不意味着您應該使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM