[SPRING] 스프링 부트 : 데이터베이스에서 구성 가져 오기
SPRING스프링 부트 : 데이터베이스에서 구성 가져 오기
누구든지 저에게이 목표를 달성하기위한 최선의 방법에 대한 지침을 제게 제공 할 수 있습니까?
Spring Boot Externalized Configuration을 확장하여 응용 프로그램의 어느 곳에서나 호출 할 수있는 단일 메소드를 갖고 싶습니다. 이 메서드는 키를 사용하여 속성 값을 검색합니다. 이 메소드는 먼저 데이터베이스 테이블을 조사하고 지정된 키를 찾지 못하면 1에 설명 된 PropertySource 순서대로 폴백합니다.
그래서 나는 비슷한 서비스를 원할 것입니다 :
@Service
public class ConfigurationService {
private final ConfigurationRepository configurationRepository;
@Autowired
public ConfigurationService(ConfigurationRepository configurationRepository) {
this.configurationRepository = configurationRepository;
}
public String getValue(String key) {
Configuration configuration = configurationRepository.findOne(key);
// Add something here to get the property from application.properties if the key does not exist in the db
return configuration == null ? null : configuration.getValue();
}
}
다음과 같이 사용할 수 있습니다.
foo = configuration.getValue("my.property");
이것에 대해 갈 수있는 더 좋은 방법이 있습니까? 내가 사용할 수있는 Spring Boot 기능이 없습니까?
편집 : 응용 프로그램이 실행되는 동안 속성 값을 변경하고 이러한 새 값을 선택할 수 싶습니다.
해결법
-
==============================
1.나는 이것을하기 위해 EnvironmentPostProcessor 스프링 기능을 사용했다.
나는 이것을하기 위해 EnvironmentPostProcessor 스프링 기능을 사용했다.
다음과 같은 클래스를 생성해야합니다.
public class ReadDbPropertiesPostProcessor implements EnvironmentPostProcessor { /** * Name of the custom property source added by this post processor class */ private static final String PROPERTY_SOURCE_NAME = "databaseProperties"; /** * Adds Spring Environment custom logic. This custom logic fetch properties from database and setting highest precedence */ @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Map<String, Object> propertySource = new HashMap<>(); try { // Build manually datasource to ServiceConfig DataSource ds = DataSourceBuilder .create() .username(USERNAME) // replace with your config .password(PASSWORD) // replace with your config .url(DATASOURCE-URL)// replace with your config .driverClassName(DRIVER) // replace with your config .build(); // Fetch all properties PreparedStatement preparedStatement = ds.getConnection().prepareStatement("SELECT name, value FROM propertyConfig WHERE service = ?"); preparedStatement.setString(1, APP_NAME); ResultSet rs = preparedStatement.executeQuery(); // Populate all properties into the property source while (rs.next()) { String propName = rs.getString("name"); propertySource.put(propName, rs.getString("value")); } // Create a custom property source with the highest precedence and add it to Spring Environment environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource)); } catch (Exception e) { throw new RuntimeException("Error fetching properties from db"); } } }
봄 학기 초에이 클래스를 실행해야하므로 spring.factories 파일을 만들고 환경 포스트 프로세서를 등록해야합니다. 이 파일은 여기에 위치해야합니다.
src/main/META-INF/spring-factories
콘텐츠에서 클래스를 spring 속성으로 설정해야합니다.
# Environment Post Processor org.springframework.boot.env.EnvironmentPostProcessor=com.your.package.ReadDbPropertiesPostProcessor
from https://stackoverflow.com/questions/30212633/spring-boot-retrieving-configuration-from-a-database by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 더 많은 데이터 소스를 가진 spring jpa hibernate (0) | 2019.04.27 |
---|---|
[SPRING] 스프링 JPA로 멀티 테넌시 (0) | 2019.04.27 |
[SPRING] JsonException _valueDeserializer가 할당되지 않았습니다. (0) | 2019.04.27 |
[SPRING] 스프링 부트 레스트 서비스 양식이 너무 큼 (0) | 2019.04.27 |
[SPRING] Spring RestTemplate으로 배열을 보내는 법? (0) | 2019.04.27 |