gpt4 book ai didi

spring-boot - spring boot 从 yml 文件中读取属性

转载 作者:行者123 更新时间:2023-12-04 13:18:39 27 4
gpt4 key购买 nike

我有一个 spring boot 应用程序,其中的属性必须从 yaml 文件中读取。

代码:

@Component
@PropertySource("classpath:application.yml")
public class ResourceProvider {

@Autowire
private Environment env;

public String getValue(String key) {
return env.getProperty("app.max.size");
}
}

yaml文件

app:
max:
size: 10

当我尝试这个时,它不起作用。我将 app.max.size 的值设为 null。对于 size,我得到的值为 10。

当我使用 application.properties 时。我能够得到想要的结果。我做错了什么吗?

应用程序属性

 app.max.size=10

最佳答案

由于您使用的是 application.yml 文件,因此您无需手动将文件加载到上下文中,因为它是 spring 应用程序的默认配置文件。您可以简单地在 @Component 装饰类中使用它们,如下所示;

@Value("${app.max.size}")
private int size;

如果您正在加载自定义 YAML 文件,那么这在 Spring 中是个大问题。使用 @PropertySource 不能简单地加载 YAML 文件。这是可能的,但需要很少的工作。首先,您需要一个自定义属性源工厂。在您的情况下,自定义 YAML 属性源工厂。

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import java.util.Properties;

public class YamlPropertySourceFactory implements PropertySourceFactory {

/**
* Create a {@link PropertySource} that wraps the given resource.
*
* @param name the name of the property source
* @param resource the resource (potentially encoded) to wrap
* @return the new {@link PropertySource} (never {@code null})
* @throws IOException if resource resolution failed
*/
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource)
throws IOException {
Properties properties = load(resource);
return new PropertiesPropertySource(name != null ? name :
Objects.requireNonNull(resource.getResource().getFilename(), "Some error message"),
properties);
}

/**
* Load properties from the YAML file.
*
* @param resource Instance of {@link EncodedResource}
* @return instance of properties
*/
private Properties load(EncodedResource resource) throws FileNotFoundException {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();

return factory.getObject();
} catch (IllegalStateException ex) {
/*
* Ignore resource not found.
*/
Throwable cause = ex.getCause();
if (cause instanceof FileNotFoundException) throw (FileNotFoundException) cause;
throw ex;
}
}
}

并且,您需要告诉 @PropertySource 注释使用此工厂而不是默认工厂,如下所示;

@Component
@PropertySource(value = "classpath:config-prop.yml", factory = YamlPropertySourceFactory.class) // Note the file name with the extension unlike a property file. Also, it's not the `application.yml` file.
public class ResourceProvider {

@Value("${app.max.size}")
private int size;
}

您可以使用上面代码片段的 size 变量中显示的属性。

虽然。如果您使用 YAML 数组声明来获取属性,即使您使用这种方式也不会很奇怪。

关于spring-boot - spring boot 从 yml 文件中读取属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56939406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com