복붙노트

[SPRING] Spring 3.1 환경은 사용자 속성 파일과 작동하지 않습니다.

SPRING

Spring 3.1 환경은 사용자 속성 파일과 작동하지 않습니다.

나는 이것을하고있다 ..

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
xmlReader
        .loadBeanDefinitions(new ClassPathResource("SpringConfig.xml"));
PropertySourcesPlaceholderConfigurer propertyHolder = new PropertySourcesPlaceholderConfigurer();
propertyHolder.setLocation(new ClassPathResource(
        "SpringConfig.properties"));
context.addBeanFactoryPostProcessor(propertyHolder);

    ......

context.refresh();

이제 내 @Configuration 파일에, 내 SpringConfig.properties에있는 속성이 내가 선택하면 선택되지 않습니다 ...

@Autowired
private Environment env
.....
env.getProperty("my.property")

하지만 내가 사용하면 그 재산을 얻는다.

@Value("${my.property}")
private String myProperty;

나는 이런 식으로 몇 줄을 더 추가하려고 시도했지만 아무 쓸모가 없었다.

ConfigurableEnvironment env = new StandardEnvironment();
propertyHolder.setEnvironment(env);

아무도 내 속성이 환경에로드되지 않는 이유를 알고 있습니까? 감사.

해결법

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

    1.PropertySourcesPlaceholderConfigurer는 속성 파일을 직접 읽습니다 (Spring에서 PropertyPlaceholderConfigurer에 의해 수행 된 것처럼). 이것은 Spring 컨텍스트에서 속성이 사용되는 방식을 변경하지 않는 포스트 프로세서입니다.이 경우 속성은 bean 정의 자리 표시 자로 만 사용할 수 있습니다.

    PropertySourcesPlaceholderConfigurer는 속성 파일을 직접 읽습니다 (Spring에서 PropertyPlaceholderConfigurer에 의해 수행 된 것처럼). 이것은 Spring 컨텍스트에서 속성이 사용되는 방식을 변경하지 않는 포스트 프로세서입니다.이 경우 속성은 bean 정의 자리 표시 자로 만 사용할 수 있습니다.

    Environment를 사용하는 PropertySourcesPlaceholderConfigurer가 아니라 그 반대입니다.

    속성 소스 프레임 워크는 응용 프로그램 컨텍스트 레벨에서 작동하지만 속성 자리 표시 자 구성자는 bean 정의의 자리 표시자를 처리하는 기능 만 제공합니다. 프로퍼티 소스 추상화를 사용하려면 @PropertySource 주석을 사용해야합니다. 즉, 구성 클래스를 다음과 같이 꾸밀 수 있습니다. @PropertySource ( "classpath : SpringConfig.properties")

    프로그래밍 방식으로 동일한 작업을 수행 할 수 있다고 믿습니다. 즉, 컨텍스트를 새로 고치기 전에 컨테이너의 ConfigurableEnvironment를 가져올 수 있습니다. getPropertySources ()를 통해 MutablePropertySources (먼저 context.getEnvironment ()를 통해 AbstractApplicationContext 환경 속성을 가져와야 함)를 수정합니다. 새로운 ResourcePropertySource (새로운 ClassPathResource (         "SpringConfig.properties")))); 그러나 당신이하고 싶은 일은 없을 것입니다. @Configuration 주석이있는 클래스를 이미 가지고 있다면 @PropertySource ( "classpath : SpringConfig.properties")로 꾸미는 것이 훨씬 간단합니다.

    PropertySourcesPlaceholderConfigurer 인스턴스의 경우, 응용 프로그램 컨텍스트에서 자동으로 속성 소스를 가져 와서 (EnvironmentAware를 구현하므로) 기본 인스턴스를 등록하기 만하면됩니다.

    사용자 정의 속성 소스 구현 예제는 http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/을 참조하십시오.

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

    2.PropertySourcesPlaceholderConfigurer (setProperties () 또는 setLocation () 사용)에 로컬 속성을 추가해도 환경에서 해당 속성을 사용할 수 없습니다.

    PropertySourcesPlaceholderConfigurer (setProperties () 또는 setLocation () 사용)에 로컬 속성을 추가해도 환경에서 해당 속성을 사용할 수 없습니다.

    사실 그것은 반대의 방식으로 작동합니다 - Environment는 기본 속성 소스 (ConfigurableEnvironment 참조)로 작동하고 PropertySourcesPlaceholderConfigurer는 $ {...} 구문을 사용하여 환경에서 속성을 사용할 수 있습니다.

  3. ==============================

    3.@ 보리스 제안에 따라이 작업을 수행했습니다.

    @ 보리스 제안에 따라이 작업을 수행했습니다.

        PropertySourcesPlaceholderConfigurer propertyHolder = new PropertySourcesPlaceholderConfigurer();
        ConfigurableEnvironment env = new StandardEnvironment();
        env.getPropertySources().addFirst(
                new ResourcePropertySource(new ClassPathResource(
                        "SpringConfig.properties")));
        propertyHolder.setEnvironment(env);
        context.addBeanFactoryPostProcessor(propertyHolder);
                context.register(SpringConfig.class);
                context.refresh();
    

    이제 @Configuration 클래스에서 @Value를 사용하여 모든 속성 (자체 속성 및 시스템 속성 포함)을 확인할 수 있습니다.

    그러나 @Configuration 클래스로 @Autowired를 얻는 환경은 위에서 설정 한 SpringConfig.properties가 아닌 시스템 속성 만 가지고 있습니다. 그러나 앞서 context.refresh ()를 호출하기 전에 ConfigurableEnvironment에도 내 속성이 있습니다. 그러나 일단 context.refresh ()가 호출되면 @Configuration으로 자동 연결되는 환경에서 내 속성이 제거됩니다.

    더 나은 구문 인 env.getProperty ( "my.property")를 사용할 수 있기를 원합니다. 그게 왜 그런지 누가 압니까?

  4. ==============================

    4.내가 속성의 두 종류를로드하는 중 하나는 환경 속성이고 다른 하나는 보통 얻을 수있는 컨텍스트입니다 servletContext.getServletContext (). 내 환경 속성은 다음과 같이 정의됩니다 : 환경에 별도로 설정되는 MOD_CONFIG_ROOT. 따라서 위치를 분리하면 코드가 들어있는 ear 파일이 자세히 표시됩니다. 여기에 구성이 있습니다. [참고 : $ {someProperty}를 사용하여 속성을 사용하기 위해 서블릿을로드하기 전에 먼저 속성 파일을로드해야했습니다.]

    내가 속성의 두 종류를로드하는 중 하나는 환경 속성이고 다른 하나는 보통 얻을 수있는 컨텍스트입니다 servletContext.getServletContext (). 내 환경 속성은 다음과 같이 정의됩니다 : 환경에 별도로 설정되는 MOD_CONFIG_ROOT. 따라서 위치를 분리하면 코드가 들어있는 ear 파일이 자세히 표시됩니다. 여기에 구성이 있습니다. [참고 : $ {someProperty}를 사용하여 속성을 사용하기 위해 서블릿을로드하기 전에 먼저 속성 파일을로드해야했습니다.]

    <bean id="externalProperties"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>file:#{ systemEnvironment['MOD_CONFIG_ROOT']
                    }#{servletContext.contextPath}/users.properties</value>
            </list>
        </property>
        <property name="searchSystemEnvironment" value="true" />
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_FALLBACK" />
    </bean>
    
  5. from https://stackoverflow.com/questions/14169834/spring-3-1-environment-does-not-work-with-user-property-files by cc-by-sa and MIT license