fix: spring-boot profile별 설정 읽을수 있도록 fix
parent
ea740def67
commit
72b4259712
@ -0,0 +1,111 @@
|
|||||||
|
package cokr.xit.foundation.boot;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.egovframe.rte.fdl.cmmn.trace.LeaveaTrace;
|
||||||
|
import org.egovframe.rte.fdl.property.impl.EgovPropertyServiceImpl;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.util.AntPathMatcher;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser.Feature;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
|
/**전자정부 프레임웤과 xit foundation을 사용하는 애플리케이션의 공통 Bean들을 설정한다.
|
||||||
|
* @author mjkhan
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@ComponentScan(basePackages = "cokr.xit")
|
||||||
|
public class CommonConfig {
|
||||||
|
@Autowired
|
||||||
|
Environment env;
|
||||||
|
|
||||||
|
/**AntPathMatcher를 반환한다.
|
||||||
|
* @return AntPathMatcher
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public AntPathMatcher antPathMatcher() {
|
||||||
|
return new AntPathMatcher();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**ObjectMapper를 반환한다.
|
||||||
|
* @return ObjectMapper
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ObjectMapper objectMapper() {
|
||||||
|
ObjectMapper bean = new ObjectMapper();
|
||||||
|
bean.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
bean.configure(Feature.ALLOW_COMMENTS, true);
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**LeaveaTrace를 반환한다.
|
||||||
|
* @return LeaveaTrace
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public LeaveaTrace leaveaTrace() {
|
||||||
|
return new LeaveaTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
//private Yml yml = new Yml("application.yml", "application.yml", env);
|
||||||
|
@Bean
|
||||||
|
public Yml yml() {
|
||||||
|
return new Yml("application.yml", "application.yml", env);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**application.yml의 설정 내용을 읽어 MessageSource Bean을 설정하여 반환한다.
|
||||||
|
* <pre><code> messageSource:
|
||||||
|
* basenames:
|
||||||
|
* - classpath:message/message-common
|
||||||
|
* - classpath:message/authentication-message
|
||||||
|
* - classpath:org/egovframe/rte/fdl/property/messages/properties</code></pre>
|
||||||
|
* @return ReloadableResourceBundleMessageSource
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public ReloadableResourceBundleMessageSource messageSource() {
|
||||||
|
ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
|
||||||
|
bean.setDefaultEncoding("UTF-8");
|
||||||
|
bean.setCacheSeconds(60);
|
||||||
|
|
||||||
|
List<String> basenames = yml().getValues("messageSource.basenames");
|
||||||
|
if (!basenames.isEmpty())
|
||||||
|
bean.setBasenames(basenames.toArray(new String[basenames.size()]));
|
||||||
|
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**application.yml의 설정 내용을 읽어 EgovPropertyServiceImpl Bean을 설정하여 반환한다.
|
||||||
|
* <pre><code> propertyService:
|
||||||
|
* properties: # 인라인 프로퍼티가 있을 경우
|
||||||
|
* - property0: value0
|
||||||
|
* - property1: value1
|
||||||
|
* extFileName: #외부 프로퍼티 파일이 있을 경우
|
||||||
|
* - encoding: UTF-8
|
||||||
|
* filename: classpath*:properties/your-file-01.properties
|
||||||
|
* - encoding: UTF-8
|
||||||
|
* filename: classpath*:properties/your-file-02.properties</code></pre>
|
||||||
|
* @return EgovPropertyServiceImpl
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public EgovPropertyServiceImpl propertyService() {
|
||||||
|
EgovPropertyServiceImpl bean = new EgovPropertyServiceImpl();
|
||||||
|
|
||||||
|
Map<String, String> properties = yml().getMap("propertyService.properties");
|
||||||
|
if (!properties.isEmpty())
|
||||||
|
bean.setProperties(properties);
|
||||||
|
|
||||||
|
Set<?> filenames = yml().getMaps("propertyService.extFileName").stream().collect(Collectors.toSet());
|
||||||
|
if (!filenames.isEmpty())
|
||||||
|
bean.setExtFileName(filenames);
|
||||||
|
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,148 @@
|
|||||||
|
package cokr.xit.foundation.boot;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import org.springframework.boot.env.YamlPropertySourceLoader;
|
||||||
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.core.env.PropertySource;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
|
||||||
|
import cokr.xit.foundation.Assert;
|
||||||
|
|
||||||
|
/**yml 파일 내용을 프로퍼티 형식으로 읽기를 지원하는 유틸리티.
|
||||||
|
* <p>
|
||||||
|
* @author mjkhan
|
||||||
|
*/
|
||||||
|
public class Yml {
|
||||||
|
private Map<String, ?> source;
|
||||||
|
private final Environment env;
|
||||||
|
|
||||||
|
/**새 Yml을 생성한다.
|
||||||
|
* @param rootName 프로퍼티 소스의 루트 이름
|
||||||
|
* @param path 클래스패스에서 yml 파일의 경로
|
||||||
|
*/
|
||||||
|
public Yml(String rootName, String path, Environment environment) {
|
||||||
|
this.env = environment;
|
||||||
|
load(rootName, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**지정하는 yml 파일의 프로퍼티들을 읽어들인다.
|
||||||
|
* @param rootName 프로퍼티 소스의 루트 이름
|
||||||
|
* @param path 클래스패스에서 yml 파일의 경로
|
||||||
|
* @return 현재 Yml
|
||||||
|
*/
|
||||||
|
public Yml load(String rootName, String path) {
|
||||||
|
source = null;
|
||||||
|
try {
|
||||||
|
List<PropertySource<?>> sources = new YamlPropertySourceLoader()
|
||||||
|
.load(rootName, new ClassPathResource(path));
|
||||||
|
if (!sources.isEmpty()) {
|
||||||
|
source = (Map<String, ?>)sources.get(0).getSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spring-boot profile별 설정이 있는 경우 처리
|
||||||
|
String[] activeProfiles = env.getActiveProfiles();
|
||||||
|
for (String profile : activeProfiles) {
|
||||||
|
PropertySource<?> profileSource = sources.stream()
|
||||||
|
.filter(ps -> ps.getName().equals(profile))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null); // default to null if no matching profile is found
|
||||||
|
|
||||||
|
if (profileSource != null) {
|
||||||
|
// Merge the properties of the profile into the source map
|
||||||
|
((Map<String, Object>)source).putAll((Map<String, ?>)profileSource.getSource());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw Assert.runtimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**지정하는 프로퍼티(아래 참고)의 값을 반환한다.
|
||||||
|
* @param key 키. 프로퍼티 이름
|
||||||
|
* <pre><code> spring:
|
||||||
|
* application:
|
||||||
|
* name: my-application
|
||||||
|
* </code></pre>
|
||||||
|
* @return 지정하는 키의 프로퍼티 값
|
||||||
|
*/
|
||||||
|
public String getValue(String key) {
|
||||||
|
if (source == null) return "";
|
||||||
|
|
||||||
|
Object obj = source.get(key);
|
||||||
|
return obj != null ? obj.toString() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**지정하는 문자열로 시작하는 프로퍼티(아래 참고) 값들을 반환한다.
|
||||||
|
* <pre><code> list:
|
||||||
|
* - item-0
|
||||||
|
* - item-2
|
||||||
|
* - item-3</code></pre>
|
||||||
|
* @param prefix 프로퍼티 접두어
|
||||||
|
* @return 지정하는 문자열로 시작하는 프로퍼티 값
|
||||||
|
*/
|
||||||
|
public List<String> getValues(String prefix) {
|
||||||
|
if (source == null) return Collections.emptyList();
|
||||||
|
|
||||||
|
return getPrefixed(prefix).stream()
|
||||||
|
.map(entry -> entry.getValue().toString())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Map.Entry<String, ?>> getPrefixed(String prefix) {
|
||||||
|
return source.entrySet().stream()
|
||||||
|
.filter(entry -> entry.getKey().startsWith(prefix))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**지정하는 문자열로 시작하는 프로퍼티(아래 참고) 값들을 Map으로 반환한다.
|
||||||
|
* <pre><code> parent:
|
||||||
|
* - property-0: value-0
|
||||||
|
* - property-1: value-1
|
||||||
|
* - property-2: value-2</code></pre>
|
||||||
|
* @param prefix 프로퍼티 접두어
|
||||||
|
* @return 지정하는 문자열로 시작하는 프로퍼티로 된 Map
|
||||||
|
*/
|
||||||
|
public Map<String, String> getMap(String prefix) {
|
||||||
|
if (source == null) return Collections.emptyMap();
|
||||||
|
|
||||||
|
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||||
|
getPrefixed(prefix).stream().forEach(entry -> putTo(map, entry));
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putTo(LinkedHashMap<String, String> map, Map.Entry<String, ?> entry) {
|
||||||
|
String key = entry.getKey();
|
||||||
|
key = key.substring(key.lastIndexOf(".") + 1);
|
||||||
|
String val = entry.getValue().toString();
|
||||||
|
map.put(key, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**지정하는 문자열로 시작하는 프로퍼티들(아래 참고)을 Map 목록으로 반환한다.
|
||||||
|
* <pre><code> parent:
|
||||||
|
* - property-0: value-0.0
|
||||||
|
* property-1: value-0.1
|
||||||
|
* - property-0: value-1.0
|
||||||
|
* property-1: value-1.1</code></pre>
|
||||||
|
* @param prefix 프로퍼티 접두어
|
||||||
|
* @return 지정하는 문자열로 시작하는 프로퍼티들의 Map 목록
|
||||||
|
*/
|
||||||
|
public List<Map<String, String>> getMaps(String prefix) {
|
||||||
|
if (source == null) return Collections.emptyList();
|
||||||
|
|
||||||
|
return getPrefixed(prefix).stream()
|
||||||
|
.map(entry -> {
|
||||||
|
String str = entry.getKey();
|
||||||
|
return str.substring(0, str.lastIndexOf("."));
|
||||||
|
})
|
||||||
|
.collect(Collectors.toSet()).stream()
|
||||||
|
.map(this::getMap)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue