簡體   English   中英

Spring 引導:從 YAML 文件加載@Value

[英]Spring Boot: Load @Value from YAML file

我需要從.yml文件加載一個屬性,該文件包含應用程序可以從中讀取文件的文件夾的路徑。

我正在使用以下代碼注入屬性:

@Value("${files.upload.baseDir}")
private String pathToFileFolder;

用於開發的.yml文件位於src/main/resources/config/application.yml下,我在生產中使用以下命令運行應用程序,以覆蓋開發設置:

java -jar app.jar --spring.config.location=/path/to/application-production.yml

Spring 引導文檔說:

SpringApplication 將從以下位置的 application.properties 文件加載屬性,並將它們添加到 Spring 環境中:

  1. 當前目錄的 /config 子目錄。

  2. 當前目錄

  3. 類路徑 /config package

  4. 類路徑根

也:

您還可以使用 YAML ('.yml') 文件替代'.properties'。

.yml文件包含:

{...}
files:
      upload:
        baseDir: /Users/Thomas/Code/IdeaProjects/project1/files
{...}

我的Application class 注釋為:

@SpringBootApplication
@EnableCaching

當我運行應用程序時,出現異常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'files.upload.baseDir' in string value "${files.upload.baseDir}"

我是否必須使用YamlPropertySourceLoader class 或添加特殊注釋以在 Spring Boot 中啟用對.yml的支持?

編輯: .yml文件包含一些其他屬性,這些屬性由 Spring Boot 成功加載,如dataSource.XXXhibernate.XXX

例如:application.yml

key:
 name: description here

你的班:

@Value("${key.name}")
private String abc;

M. Deinum 是對的,我提供的設置正在運行 - yml文件縮進錯誤,因此無法找到該屬性。

我發現上面的方法對我不起作用,因為我試圖在構造函數中訪問變量。 但是在構建時,尚未注入該值。 最終我使用這個解決方法讓它工作: https : //mrhaki.blogspot.com/2015/04/spring-sweets-using-value-for.html

也許這對其他人有幫助。

對我來說,屬性文件中的重復鍵導致了這個......

我在大 yml 文件中不知不覺地使用了相同的密鑰。

key:   
 key1: value
 key2: value

key:  
 key3: value

在 yml 屬性文件中:

xxxx:
     page:
        rowSize: 1000

創建您的 Yaml 屬性配置類:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "xxxx")
public class YmlPropertiesConfig {

    private Page page;

    public Page getPage() {
        return page;
    }
    public void setPage(Page page) {
        this.page = page;
    }

    public class Page {
        private Integer rowSize;

        public Integer getRowSize() {
            return rowSize;
        }

        public void setRowSize(Integer rowSize) {
            this.rowSize = rowSize;
        }
    }    
}

最后得到它並使用它:

public class XXXXController {

     @Autowired
     private YmlPropertiesConfig ymlProperties;

     public String getIt(){

        Integer pageRowSize = ymlProperties.getPage().getRowSize();
     }
}

我遇到了這個問題Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder原因我已經在properties.yaml中設置了測試spring引導配置文件。 運行沒有配置文件的應用程序時,Spring 找不到測試配置文件的屬性。

因此,從屬性或 yaml 中刪除 spring boot 配置文件或使用啟用的配置文件運行應用程序。

配置文件示例如下:

@Configuration
public class AppConfig {
  @Value("${prop.foo}")
  private String foo;
  @Value("${prop.bar}")
  private String bar;

  @Bean
  BeanExample beanExample() {
    return new BeanExample(foo, bar);
  }
}

對於那些對 @RestController 有疑問的人,我按如下方式進行:

@Autowired
@Value("${google.recaptcha}") 
private String keyRecaptcha;

我的屬性文件被錯誤地命名為applcation.properties ,因為它是由 Spring 初始值設定項自動生成的。 但是我以 .yml 格式在那里添加了屬性,並且沒有檢索到相同的錯誤。

當我將文件重命名為application.yml時,它開始工作了。

暫無
暫無

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

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