복붙노트

[SPRING] Spring 3.0의 다중 특성 파일

SPRING

Spring 3.0의 다중 특성 파일

나는 각각의 응용 프로그램 컨텍스트 속성 파일을 가진 여러 개의 별도 모듈로 프로젝트를 진행 중이다. Spring에 의한 자리 표시 자 해결에 사용할 수 있도록 이러한 모든 속성을로드 할 수 있어야합니다.

이전 질문에서이 점을 언급했으며, 각 컨텍스트에서 PropertyPlaceholderConfigurer를 사용하고 우선 순위에 따라 순서를 지정하고 ignoreUnresolveablePlaceholders를 true로 설정하여 이러한 속성 파일이 서로 위로 상호 참조 할 수 있도록하는 좋은 블로그 게시물을 여기에 있습니다.

그러나, 일부 사용자 지정 자리 표시 자 해상도 (일부 yaml 파일에서 구문 분석 오전)로드하는 속성을 사용할 수있게하려면 원하는대로 내 문제가 해결되지 않습니다. 이 경우 PropertyPlaceholderHelper를 사용해야하며, Properties 객체를 인수로 사용해야합니다.

내가 알 수있는 한, 가능한 해결책은 다음과 같습니다.

1) 모든 등록 정보 파일을 하나의 등록 정보 bean으로 병합하십시오. 그런 다음 PropertyPlaceholderConfigurer (Spring의 내부 자리 표시 자 해상도 용)를 만들고 PropertyPlaceholderHelper (내 자리 표시 자 해상도 용)와 함께 사용할 수 있습니다.

2) 어떻게 든 PropertyPlaceholderHelper를 설정하여 PropertyPlaceholderConfigurers가 보유한 속성 집합과 해당 계층 구조 배열을 사용하도록 설정하고 해당 블로그 게시물의 조언을 따르십시오.

불행히도 나는이 중 하나를 수행하는 방법을 해결할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다!

추신 : Spring 3.1이 큰 도움이 될 것 같습니다 ... 불행히도 우리는 아직 준비가되지 않았으므로 나를 조종 할 솔루션이 필요합니다!

**** 편집하다 ****

지금까지 해답을 주셔서 감사합니다. 그것들은 좋은 해답이지만 불행히도 나를 돕지는 않을 것입니다. (그리고 앞서 언급하지 않은 것에 대해 사과드립니다.) 우리는 현재 프로젝트의 핵심 모듈과 비 핵심 모듈을 분리하는 과정에 있습니다. 즉, 핵심 모듈과 해당 응용 프로그램 컨텍스트는 등록 정보 파일의 이름을 하드 코딩 할 수 없습니다. 안타깝게도 Spring의 classpath 스캐닝은 망가진 것처럼 보이기 때문에 "classpath * : * .properties"유형의 와일드 카드는 최상위 프로젝트가 아닌 개별 모듈을 빌드 할 때만 작동합니다 (이것은 알려진 문제점이라고 생각합니다).

문제는 비 핵심 모듈에 정의 된 특성 파일을 핵심 모듈에 정의 된 기존 특성 파일에 병합하는 방법입니다. 현재 BeanPostProcessor를 사용하려고합니다. 더 간단하고 우아한 방법이 있는지 궁금합니다.

감사

해결법

  1. ==============================

    1.여러 개의 속성 파일을 하나의 빈으로 쉽게 수집 할 수 있습니다.

    여러 개의 속성 파일을 하나의 빈으로 쉽게 수집 할 수 있습니다.

    <bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
      <property name="singleton" value="true"/>
      <property name="ignoreResourceNotFound" value="true"/>
      <property name="locations">
        <list>
          <value>classpath*:default.properties</value>
          <value>classpath*:overrides.properties</value>
          <value>file:${APP_HOME}/**/*.properties</value>
        </list>
      </property>
    </bean>
    

    이 특별한 예제는 classpath의 모든 default.properties, overrides.properties와 APP_HOME의 속성 파일을 수집합니다. 이제 ProperyPlaceholderConfigurer 또는 사용자 정의 포스트 프로세서에서이 bean을 참조 할 수 있습니다.

  2. ==============================

    2.다음 코드 스 니펫을 시작해야합니다.

    다음 코드 스 니펫을 시작해야합니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="searchSystemEnvironment" value="true"/>
        <property name="locations">
            <list>
                <value>classpath*:config/*/config1/*.properties</value>
                <value>classpath*:config/*/config2/*.properties</value>
                <value>classpath*:config/*/config3/*.properties</value>
                <value>classpath*:custom.properties</value>
            </list>
        </property>
    </bean>     
    

    다음 계층에 속성 파일을 저장하여 클래스 경로를 통해 config에 연결할 수 있는지 확인하십시오.

    config
      config1
         a.properties
      config2
         b.properties
      config3
         c.properties
    custom.properties
    
  3. ==============================

    3.이것은 당신이해야 할 모든 것입니다 :

    이것은 당신이해야 할 모든 것입니다 :

    <context:property-placeholder location="first.properties" order="0" ignore-unresolvable="true"/>
    <context:property-placeholder location="second.properties" order="0" ignore-unresolvable="true"/>
    <context:property-placeholder location="empty.properties" order="1"/>
    

    문제는 간단합니다 : 속성 자리 표시 자에 특정 속성에 대한 값이없는 경우 다른 속성 자리 표시자가 존재하더라도 예외를 throw합니다.

    이 솔루션에서는 어느 속성이 마지막 property-placeholder인지 알기 위해 순서를 사용하고 모든 property-placeholder가 값을 제공 할 수 있도록 ignore-unresolvable = "true"를 설정합니다. 다중 모듈 프로젝트에서 마지막 속성 자리 표시자는 비어 있거나 failsafe-default를 제공 할 수 있습니다.

    참고 : 모든 property-placeholder를 ignore-unresolvable = "true"로 설정하면 Spring은 예외를 throw하지 않고 작성한 내용을 전달합니다. 물론 String이 아닌 다른 것으로 기대된다면 java.lang.NumberFormatException과 같은 개념을 얻을 것입니다 : 형식 변환 중에 입력 문자열 : "$ {something}".

    참고 : 특정 속성 값이있는 첫 번째 (가장 낮은 순서의 속성) 자리 표시자가 사용됩니다. 특성을 재 지정하려면 0과 1 또는 property-override보다 더 큰 순서 범위를 사용하십시오.

    Spring 3.2.1로 테스트되었지만 언급 된 모든 속성은 3.0에 존재합니다. PropertyPlaceholderConfigurer의 JavaDoc을 참조하십시오.

  4. from https://stackoverflow.com/questions/8924912/multiple-properties-files-in-spring-3-0 by cc-by-sa and MIT license