Spring Boot从yml文件读取属性

时间:2019-07-08 16:49:42

标签: spring-boot

我有一个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时。我能够得到理想的结果。 我做错了什么吗?

application.properties

 app.max.size=10

4 个答案:

答案 0 :(得分:1)

来自文档:

  

无法使用@PropertySource批注来加载YAML文件。因此,在需要以这种方式加载值的情况下,需要使用属性文件。

Official spring boot documentation reference

答案 1 :(得分:1)

由于您正在使用func ApplePushNotificationService(deviceToken string, parameters string) { cert, err := certificate.FromP12File("./hookupAPNS.p12", "******") //p12.filename if err != nil { log.Fatal("Cert Error:", err) } notification := &apns2.Notification{} notification.DeviceToken = deviceToken notification.Topic = "com.preferme.hookup" payload := payload.NewPayload().Alert(parameters).AlertBody(parameters).Badge(1).Sound("sound.wav").Custom("key", "val") notification.Payload = payload client := apns2.NewClient(cert).Production() res, err := client.Push(notification) if err != nil { log.Fatal("push Error:", err) } fmt.Printf("%v %v %v\n", res.StatusCode, res.ApnsID, res.Reason) } 文件,因此不需要手动将文件加载到上下文,因为它是application.yml应用程序的默认配置文件。您可以像下面这样在spring装饰类中使用它们;

@Component

如果您要加载自定义@Value("${app.max.size}") private int size; 文件,那么在Spring中这是一个巨大的问题。使用YAML不能简单地加载YAML文件。有可能,但几乎不需要任何工作。首先,您需要一个自定义属性源工厂。您的情况是自定义YAML属性源工厂。

@PropertySource

而且,每次使用时,都需要告诉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; } 变量中显示的属性。

尽管。如果您使用YAML数组声明获取属性,那么即使使用这种方法,也不会有什么特殊之处。

答案 2 :(得分:0)

基于Spring Docs,@ PropertySource不支持yml文件。

要解析yml文件,请参考以下链接:https://www.mkyong.com/spring-boot/spring-boot-yaml-example/

答案 3 :(得分:-1)

您可以通过以下方式读取值:

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

public String getValue(String key) {
   return size;
}