[SPRING] Spring 속성 place holder를 사용하여 파일 .properties에서 목록 읽기
SPRINGSpring 속성 place holder를 사용하여 파일 .properties에서 목록 읽기
Spring 속성 place holder를 사용하여 빈리스트 프라퍼티를 채우고 싶다.
<bean name="XXX" class="XX.YY.Z">
<property name="urlList">
<value>${prop.list}</value>
</property>
</bean>
prop.list.one=foo
prop.list.two=bar
어떤 도움이라도 대단히 감사하겠습니다.
해결법
-
==============================
1.util : properties 요소를 사용하여 속성을로드하십시오. PropertyPlaceholderConfigurer를 사용하여 파일의 경로를 지정할 수 있습니다.
util : properties 요소를 사용하여 속성을로드하십시오. PropertyPlaceholderConfigurer를 사용하여 파일의 경로를 지정할 수 있습니다.
<bean name="XXX" class="XX.YY.Z"> <property name="urlList"> <util:properties location="${path.to.properties.file}"/> </property> </bean>
업데이트 나는 그 질문에 대해 오해했다. key가 특정 문자열로 시작하는 속성 만 반환하려고합니다. 이를 달성하는 가장 쉬운 방법은 bean의 setter 메소드 내에서 그렇게하는 것입니다. 문자열을 빈에 별도의 속성으로 전달해야합니다. 위의 선언을 확장 :
<bean name="XXX" class="XX.YY.Z" init-method="init"> <property name="propertiesHolder"> <!-- not sure if location has to be customizable here; set it directly if needed --> <util:properties location="${path.to.properties.file}"/> </property> <property name="propertyFilter" value="${property.filter}" /> </bean>
당신의 XX.YY.Z 빈에서 :
private String propertyFilter; private Properties propertiesHolder; private List<String> urlList; // add setter methods for propertyFilter / propertiesHolder // initialization callback public void init() { urlList = new ArrayList<String>(); for (Enumeration en = this.propertiesHolder.keys(); en.hasMoreElements(); ) { String key = (String) en.nextElement(); if (key.startsWith(this.propertyFilter + ".") { // or whatever condition you want to check this.urlList.add(this.propertiesHolder.getProperty(key)); } } // for }
여러 다른 장소에서이 작업을 수행해야하는 경우 위의 기능을 FactoryBean으로 래핑 할 수 있습니다.
-
==============================
2.더 간단한 해결책 :
더 간단한 해결책 :
class Z { private List<String> urlList; // add setters and getters }
당신의 bean 정의
<bean name="XXX" class="XX.YY.Z"> <property name="urlList" value="#{'${prop.list}'.split(',')}"/> </bean>
그런 다음 속성 파일에서 :
prop.list=a,b,c,d
-
==============================
3.
<bean id="cpaContextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="urls"> <bean class="org.springframework.util.CollectionUtils" factory-method="arrayToList"> <constructor-arg type="java.lang.Object"> <bean class="org.springframework.util.StringUtils" factory-method="tokenizeToStringArray"> <constructor-arg type="java.lang.String" value="${myList}"/> <constructor-arg type="java.lang.String" value=" "/> </bean> </constructor-arg> </bean> </property>
어디에:
myList=http://aaa http://bbb http://ccc
-
==============================
4.여기에서 볼 수있는 유일한 방법은 'MessageSourceAware'인터페이스를 구현하여 messageResource를 가져온 다음 수동으로 목록을 채 웁니다.
여기에서 볼 수있는 유일한 방법은 'MessageSourceAware'인터페이스를 구현하여 messageResource를 가져온 다음 수동으로 목록을 채 웁니다.
class MyMessageSourceAwareClass implemets MessageSourceAware{ public static MessageSource messageSource = null; public void setMessageSource(MessageSource _messageSource) { messageSource = _messageSource; } public static String getMessage( String code){ return messageSource.getMessage(code, null, null ); } }
--- 특성 파일 ---
prop.list=foo;bar;one more
이 목록을 채우십시오.
String strlist = MyMessageSourceAwareClass.getMessage ( "prop.list" ); if ( StringUtilities.isNotEmptyString ( strlist ) ){ String[] arrStr = strList.split(";"); myBean.setList ( Arrays.asList ( arrStr ) ); }
-
==============================
5.다음 Bean 정의를 추가하기 만하면됩니다.
다음 Bean 정의를 추가하기 만하면됩니다.
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:myprops.properties</value> </list> </property> </bean>
이렇게 사용하면 포트가 myprops.properties에 정의되어 있습니다.
<bean id="mybean" class="com.mycompany.Class" init-method="start"> <property name="portNumber" value="${port}"/> </bean>
-
==============================
6.몇 가지 방법이 있는데 그 중 하나가 아래에 있습니다.
몇 가지 방법이 있는데 그 중 하나가 아래에 있습니다.
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer(); cfg.setLocation(new FileSystemResource("jdbc.properties")); cfg.postProcessBeanFactory(factory);
from https://stackoverflow.com/questions/1599086/reading-a-list-from-a-file-properties-using-spring-properties-place-holder by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 예외 처리를 위해 @ExceptionHandler 또는 HandlerExceptionResolver보다 @ControllerAdvice의 장점은 무엇입니까? (0) | 2019.02.02 |
---|---|
[SPRING] org.springframework.ws.WebServiceMessage에 SoapHeader를 추가하십시오. (0) | 2019.02.01 |
[SPRING] 스프링 프로토 타입 범위를 사용해야 할 때? (0) | 2019.02.01 |
[SPRING] JPA에서 Spring MVC를 사용하여 엔티티의 속성 하위 집합 만 업데이트 할 수 있습니까? (0) | 2019.02.01 |
[SPRING] 동일한 스프링 빈을 같은 이름으로 두 번 정의하기 (0) | 2019.02.01 |