Загрузить файл пользовательских свойств в Spring Boot MVC Main - PullRequest
0 голосов
/ 08 мая 2020

Я создал myApp.properties в расположении папки ресурсов и упомянул server.port в этом файле.

myApp.properties

myApp.server.port=8020

Теперь я хочу прочитать, загрузите это свойство в свое приложение. Но я должен прочитать это, прежде чем я стану сервером.

Вот я пытаюсь сделать вот так

@SpringBootApplication
@ComponentScan(basePackages = {"com.myorg.myapp" })
@EnableConfigurationProperties
@PropertySource("classpath:myApp.properties")
@Component
public class MyAppApplication {

    @Value("${myApp.server.port}")
    private static String serverPort;

    public static void main(String[] args) throws Exception{
        try {

            SpringApplication appCtxt = new SpringApplication(MyAppApplication.class);
            appCtxt.setDefaultProperties(Collections
                    .singletonMap("server.port", serverPort));

            appCtxt.run(args);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Но serverPort идет как null.

Я также пытался создать отдельный файл конфигурации, подобный этому, но к нему нельзя получить доступ в static main

@Configuration
@PropertySource("myApp.properties")
@ConfigurationProperties

public class MyAppConfig {

    @Value("${myApp.server.port}")
    private String serverPort;

    /**
     * @return the serverPort
     */
    public String getServerPort() {
        return serverPort;
    }

}

Любое предложение было бы полезным.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Spring boot вводит свойства во время инициализации контекста приложения. Это происходит (запускается) в строке:

appCtxt.run(args);

Но вы пытаетесь получить доступ к свойству перед этой строкой - вот почему это не работает.

Итак, суть в том, что использование «@Value» в основном методе не работает и не должно.

Теперь из фрагмента кода, похоже, вы могли бы просто следовать «стандартам» весенней загрузки и создайте файл application.properties с помощью:

server.port=1234

Процесс запуска встроенного веб-сервера при весенней загрузке учитывает это свойство, и в нижней строке он будет иметь тот же эффект, и Tomcat будет запущен на порту 1234

Обновление 1

На основе комментария OP:

Итак, как я могу иметь несколько application.properties.

В документации Spring Boot написано, что application.properties разрешаются из пути к классам. Итак, вы можете попробовать следующее, если у вас есть разные модули A, B, C и веб-приложение D:

  • Создайте src/main/resources/application.properties внутри каждого из 4 модулей и упакуйте все вместе. Значения конфигурации будут объединены (надеюсь, они не будут sh)

  • Если вы настаиваете на именовании свойств A.properties, B.properties и C .properties для каждого не веб-модулей, вы можете сделать следующее (я покажу для модуля A, но B и C могут делать то же самое).

@Configuration
@PropertySource("classpath:A.properties")
public class AConfiguration {

}

Create in Module A: src/main/resources/A.properties

Если вам нужно загрузить AConfiguration автоматически - сделайте модуль A стартером (используя функцию автоконфигурации spring -boot):

Создайте файл src/resources/META-INF/spring.factories со следующим содержимым :

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
<package_of_AConfiguration>.AConfiguration

Также требовалось отделить C от всего пакета, где он может работать как пакет для некоторых и как отдельный для некоторых

Хотя я не совсем понял требования, но вы можете использовать @ConditionalOnProperty для конфигурации CConfiguration (которая будет создана так же, как AConfiguration.java в моем предыдущем примере), но на этот раз для модуля C.

Если условие выполнено, конфигурация будет запущена и загрузить некоторые beans / загрузить свои собственные свойства или что-то еще. В целом условные выражения (и, в частности, профили весной) могут помочь достичь желаемой гибкости.

0 голосов
/ 08 мая 2020

По умолчанию файл application.properties может использоваться для хранения пар свойств, хотя вы также можете определить любое количество дополнительных файлов свойств.

Если вы сохраните myApp.server.port=8020 в application.properties, он будет работает нормально.

Чтобы зарегистрировать файл свойств Custome, вы можете аннотировать @Configuration класс с помощью дополнительной @PropertySource аннотации:

@Configuration
@PropertySource("classpath:custom.properties")
@PropertySource("classpath:another.properties")
public class ConfigClass {
   // Configuration
}

убедитесь, что ваш путь к классу правильный.

...