[SPRING] Spring 3.1 환경은 사용자 속성 파일과 작동하지 않습니다.
SPRINGSpring 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.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.PropertySourcesPlaceholderConfigurer (setProperties () 또는 setLocation () 사용)에 로컬 속성을 추가해도 환경에서 해당 속성을 사용할 수 없습니다.
PropertySourcesPlaceholderConfigurer (setProperties () 또는 setLocation () 사용)에 로컬 속성을 추가해도 환경에서 해당 속성을 사용할 수 없습니다.
사실 그것은 반대의 방식으로 작동합니다 - Environment는 기본 속성 소스 (ConfigurableEnvironment 참조)로 작동하고 PropertySourcesPlaceholderConfigurer는 $ {...} 구문을 사용하여 환경에서 속성을 사용할 수 있습니다.
-
==============================
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.내가 속성의 두 종류를로드하는 중 하나는 환경 속성이고 다른 하나는 보통 얻을 수있는 컨텍스트입니다 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>
from https://stackoverflow.com/questions/14169834/spring-3-1-environment-does-not-work-with-user-property-files by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 요청 매개 변수에 기반한 Spring 보안 인증 (0) | 2019.01.31 |
---|---|
[SPRING] 하나의 컨트롤러에만 Spring HandlerInterceptor를 바인드한다. (0) | 2019.01.31 |
[SPRING] 선두의 낙타 름 단어가 한 글자 밖에없는 경우 왜 Jackson 2는 첫 번째 대문자를 인식하지 못합니까? (0) | 2019.01.31 |
[SPRING] 스프링 보안 - 사용자 정의 자동 인증 (0) | 2019.01.31 |
[SPRING] JSP EL 표현식에서 Spring Security Principal 가져 오기 (0) | 2019.01.31 |