свойства весенней загрузки при чтении из файла yml - PullRequest
0 голосов
/ 08 июля 2019

У меня есть приложение весенней загрузки, где свойства должны быть прочитаны из файла 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 как ноль. Для size я получаю значение как 10.

Когда я использую application.properties. Я могу получить желаемый результат. Я что-то делаю неправильно?

application.properties

 app.max.size=10

Ответы [ 4 ]

1 голос
/ 09 июля 2019

Поскольку вы используете файл 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 для получения свойств, это будет немного странным, даже если вы будете использовать этот способ.

1 голос
/ 08 июля 2019

из документации:

Файлы YAML не могут быть загружены с помощью аннотации @PropertySource.Таким образом, в случае, если вам нужно загрузить значения таким образом, вам нужно использовать файл свойств.

Официальная ссылка на документацию весенней загрузки

0 голосов
/ 08 июля 2019

На основе Spring Docs @PropertySource не поддерживает файлы yml.

Для анализа yml-файлов перейдите по этой ссылке: https://www.mkyong.com/spring-boot/spring-boot-yaml-example/

0 голосов
/ 08 июля 2019

Вы можете прочитать значение по:

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

public String getValue(String key) {
   return size;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...