Получение свойства SpringBoot в не-Spring классе - PullRequest
0 голосов
/ 25 сентября 2018

В моем файле application.properties определено несколько свойств.Они загружаются в различные файлы конфигурации в системе с помощью аннотаций @Configuration, @PropertySource и @ConfigurationProperties.

Кроме того, у меня есть отдельная от этой системы библиотека, в которой нетзависимость от весны (и в идеале так и останется).В какой-то момент выполнения системы она инициализирует экземпляр класса из этой библиотеки с помощью отражения и конструктора без аргументов .Однако в этой инициализации я хочу получить свойство Spring и назначить его локальному полю - однако, как я упоминал ранее, этот библиотечный класс не настроен Spring и фактически находится в совершенно другом проекте.Как это можно сделать?

Мое текущее решение состоит в том, что, когда свойство инициализируется в классе config, установщик свойства также устанавливает системное свойство (через System.setProperty("someProp", propValue)), а затем в аргументах no args.конструктор библиотечного класса я называю System.getProperty("someProp").Тем не менее, это выглядит очень странно, особенно в части, где я установил переменную.Возможно, есть какой-то способ настроить SpringBoot для автоматического распространения этого конкретного свойства, чтобы оно стало также системным свойством?

Мой код atm

ServiceConfig.class

@Configuration
@PropertySource("classpath:application.properties")
@ConfigurationProperties(prefix = "service")
public class ServiceConfig {

  private String serviceUrl;

  public String getServiceUrl() {
    return serviceUrl;
  }

  public void setServiceUrl(String serviceUrl) {
    this.serviceUrl = serviceUrl;
    System.setProperty("SERVICE_URL", serviceUrl);
  }
}

Мой application.properties

service.serviceUrl=http://localhost:8000

LibraryClass.class

public class LibraryClass {
    private final String serviceUrl;

    public LibraryClass() {
        this.serviceUrl = getProperty("OAUTH_SERVICE_URL");
    }

    ...
}

1 Ответ

0 голосов
/ 25 сентября 2018

, если ваш LibraryClass имеет метод установки - в приведенном ниже примере с именем setServiceUrl(...) - чтобы установить это свойство конфигурации, вы можете добавить его в существующий класс конфигурации ServiceConfig:

@Bean
public LibraryClass getLibraryClass(@Value(${"OAUTH_SERVICE_URL"}) String serviceUrl) {
    LibraryClass libraryClass = new LibraryClass();
    libraryClass.setServiceUrl(serviceUrl);
    return libraryClass;
}

Другоечем это - если вы не можете изменить LibraryClass, потому что он является частью сторонней библиотеки или около того ... вы можете использовать экземпляр Spring * Environment, чтобы прочитать все необходимые свойства, которые - позже - будут доступны внутри конструктора LibraryClass и установите их так же, как вы указали в свойствах системы.Также добавьте это в свой класс конфигурации:

@Autowired
public void setSystemPropsNeededForLibraryClassConstruction(Environment environment) {
    System.setProperty("serviceUrl", environent.getProperty("serviceUrl"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...