복붙노트

[SPRING] Spring 속성 place holder를 사용하여 파일 .properties에서 목록 읽기

SPRING

Spring 속성 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. ==============================

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

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

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

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

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

    6.몇 가지 방법이 있는데 그 중 하나가 아래에 있습니다.

    몇 가지 방법이 있는데 그 중 하나가 아래에 있습니다.

    XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
    PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
    cfg.setLocation(new FileSystemResource("jdbc.properties"));
    cfg.postProcessBeanFactory(factory);
    
  7. 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