복붙노트

[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. ==============================

    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
    
  2. from https://stackoverflow.com/questions/30212633/spring-boot-retrieving-configuration-from-a-database by cc-by-sa and MIT license