Как получить доступ к свойству в файле .properties во время или перед методом main () в Spring? - PullRequest
0 голосов
/ 10 апреля 2020

Мы преобразовали существующее веб-приложение в Spring Boot.

Все, что я хочу сделать, - это использовать @Profile ("production"). Мы храним это в myProps.properties в папке ресурсов.

Я могу получить доступ к файлу .properties по всему приложению, используя @Value, но, похоже, чтобы заставить @Profile работать, у вас есть установить активные профили до того, как ServletContext будет установлен / завершен, что, по-видимому, происходит во время метода main ().

Я пробовал десятки вещей и потерпел неудачу. Я обнаружил, что вы не можете установить поле stati c с @Value в основном классе приложения. Я попытался создать класс, который реализует WebApplicationInitializer, например https://www.baeldung.com/spring-profiles, но мой метод onStartup (), который я переопределяю, никогда не запускается ... Я поставил точку останова, и он никогда не попадал. Единственный способ получить точку останова - если я @Autowire servletContext для этого метода, но тогда контекст уже установлен и не может быть изменен.

Я пробовал AnnotationConfigWebApplicationContext, я пробовал ServletContainerInitializer, я пробовал ConfigurableEnvironment, et c. Я чувствую, что иду по кругу.

Я чувствую, что здесь есть большой кусок, который мне не хватает, чтобы сделать что-то "Весенним путем". Может ли кто-нибудь предложить мне Java настроенный на аннотации способ получения свойства и настройки активных профилей для последующего использования в продукте? Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Исходя из ваших комментариев, в качестве решения я предлагаю что-то вроде следующего:

Определите ваши задачи как бины с @Component s и аннотируйте их с помощью @Profile, чтобы разделить их на среду, которую вы хотите они будут использоваться в (я предпочитаю задавать профили в качестве переменных среды).

@Component
@Profile("production")
public class TaskA implements Task {
    public void doWork(){}
}

@Component
@Profile("staging")
public class TaskB implements Task {
    public void doWork(){}
}

Пометка этих классов с помощью @Component означает, что Spring будет управлять ими и их можно будет внедрить, возможно, в @Component, который выполняется Задачи:

@Component
public class TaskDoer {
    private List<Task> tasksToDo;
    @Inject
    public TaskDoer(List<Task> tasksToDo) {
        this.tasksToDo = tasksToDo;
    }
}

При развертывании приложения настройте профиль для использования в переменных среды любым способом, который подходит для вашей настройки:

SPRING_PROFILES_ACTIVE = production, someOtherProfile

Теперь, когда приложение запускается Spring увидит, что активными профилями являются «production» и «someOtherProfile» (можно настроить несколько профилей), и не будет загружать бины с @Profile, которые не для этого профиля.

0 голосов
/ 10 апреля 2020

Зачем вам это нужно перед основным? Почему бы вам просто не создать несколько файлов свойств и определить профиль в файле свойств верхнего уровня?

(parent) application.properties

spring.profiles.active = development-application.properties

(profile) development-application. свойства

my.value = foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...