Spring Boot :从YAML文件加载@Value

3qpi33ja  于 2022-12-17  发布在  Spring
关注(0)|答案(7)|浏览(207)

我需要从.yml文件加载一个属性,该文件包含应用程序可以从中读取文件的文件夹的路径。
我使用下面的代码来注入该属性:

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

用于开发的.yml文件位于src/main/resources/config/application.yml,im下,在生产中使用以下命令运行应用程序,以覆盖开发设置:

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

Sping Boot 文档说明:
SpringApplication将从application.properties以下位置的www.example.com文件加载属性,并将其添加到Spring环境中:
1.当前目录的/config子目录。
1.当前目录
1.类路径/配置包
1.类路径根
以及:
您也可以使用YAML('. yml')文件来替代'. properties'。
.yml文件包含:

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

我的Application类注解如下:

@SpringBootApplication
@EnableCaching

当我运行应用程序时,我得到一个异常:

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

我是否必须使用YamlPropertySourceLoader类或添加一个特殊的注解来启用Sping Boot 中对.yml的支持?
编辑:.yml文件包含一些其他属性,这些属性可以通过Sping Boot 成功加载,如dataSource.XXXhibernate.XXX

am46iovg

am46iovg1#

例如:application.yml

key:
 name: description here

您的班级:

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

zynd9foi2#

M.代努姆是正确的,我提供的设置是工作的-yml文件缩进错误,所以无法找到属性。

00jrzges

00jrzges3#

我发现上面的方法对我不起作用,因为我试图在构造函数中访问变量,但是在构造时,值还没有被注入,最后我使用了下面的方法:https://mrhaki.blogspot.com/2015/04/spring-sweets-using-value-for.html
也许这对其他人有帮助。

wtlkbnrh

wtlkbnrh4#

对我来说是财产文件里的重复键导致了这个...
我在大的yml文件中不知不觉地使用了相同的键。

key:   
 key1: value
 key2: value

key:  
 key3: value
slmsl1lt

slmsl1lt5#

在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();
     }
}
kxxlusnw

kxxlusnw6#

我遇到了Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder问题,因为我在properties.yaml中设置了测试Sping Boot 配置文件。当运行没有配置文件的应用程序时,Spring无法找到测试配置文件的属性。
因此,从属性或yaml中删除spring Boot profile,或者使用启用的profile运行应用程序。
配置文件示例如下:

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

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

guykilcj7#

对于那些在使用@RestController时遇到问题的人,我的做法如下:

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

相关问题