Spring XML에서 기본 속성 값을 지정하는 방법이 있습니까?


91

우리는 사용하는 PropertyPlaceholderConfigurer와 (우리의 봄 구성에서 사용하는 자바의 특성을 여기에 세부 사항 )

예 :

<foo name="port">
  <value>${my.server.port}</value>
</foo>

추가 속성을 추가하고 싶지만 기존 인스턴스가 모두 기본값을 사용할 수있는 분산 시스템이 있습니다. 재정의 속성 값이 정의되지 않은 경우 Spring 구성에 기본값을 표시하여 모든 속성 파일을 업데이트하지 않는 방법이 있습니까?

답변:


14

여기에 설명 된 PropertyOverrideConfigurer를 찾고 있습니까?

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

또 다른 빈 팩토리 포스트 프로세서 인 PropertyOverrideConfigurer는 PropertyPlaceholderConfigurer와 유사하지만 후자와는 대조적으로 원래 정의에는 기본값이 있거나 빈 속성에 대한 값이 전혀 없을 수 있습니다. 대체 특성 파일에 특정 Bean 특성에 대한 항목이없는 경우 기본 컨텍스트 정의가 사용됩니다.


누군가 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA가 무엇인지 설명해 주 시겠습니까? 나는 다른 사람들이 알고 확신 난 그냥 바보 해요,하지만 단지의 경우에 ...
스리 Sarnobat

276

Spring 3는 ${my.server.port:defaultValue}구문을 지원 합니다.


8
참고로 : SPR-4785
cubanacan 2013 년

11
나를 위해 속성이 정의되었는지 여부에 관계없이 항상 속성을 기본값으로 재정의합니다.
Ondrej Bozek

12
@OndrejBozek-(오래된 게시물을 작성하게되어 죄송합니다) 동일한 문제가 발생할 수있는 문제에 직면했습니다 . Spring Framework 문제 [ jira.spring.io/browse/SPR-9989]를 참조하십시오 . 여러 자리 표시 자 구성자가 관련된 경우 ':'표기법으로 지정된 기본값은 체인의 첫 번째 자리 표시 자 구성자에 의해서만 확인됩니다. 따라서 첫 번째 구성자에 속성이 없으면 체인 아래에있는 구성자에 속성이 있더라도 속성은 항상 기본값으로 설정됩니다. [참조 stackoverflow.com/a/22452984/599609을]

1
${my.server.port:-defaultValue}또한 동일한 결과를 제공하는 것 같습니다 . " :-"이 아닌 " "에 유의하십시오 :.
선장 남자

2
<context:property-placeholder/>이 기능 을 사용 하려면 추가해야합니다 . 또는 추가해야합니다.PropertyPlaceholderConfigurer
shuckc

32

조금 더 잘 알려진 기능이 있습니다. 하드 코딩 된 값 대신 구성 가능한 기본값을 사용할 수 있습니다. 예는 다음과 같습니다.

config.properties :

timeout.default=30
timeout.myBean=60

context.xml :

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>config.properties</value>
    </property>
</bean>

<bean id="myBean" class="Test">
    <property name="timeout" value="${timeout.myBean:${timeout.default}}" />
</bean>

나중에 쉽게 재정의 할 수있는 동안 기본값을 사용하려면 config.properties에서 다음을 수행하십시오.

timeout.myBean = ${timeout.default}

이것은 나를 위해 일했습니다 ${timeout.myBean:${timeout.default}}. 이로 인해 내 기본값도 변수가 될 수 있습니다.
NewestStackOverflowUser


11

기본값은 다음과 :같이 속성 키 뒤에 올 수 있습니다.

<property name="port" value="${my.server.port:8080}" />

또는 자바 코드에서 :

@Value("${my.server.port:8080}")
private String myServerPort;

보다:

BTW, Elvis 연산자 는 Spring Expression Language (SpEL) 내에서만 사용할 수 있습니다.
예 : https://stackoverflow.com/a/37706167/537554


8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html 은 빈 자체에 정의 된 "로컬 속성"이 파일에서 읽은 값으로 재정의되는 기본값으로 간주 될 것이라고 지적합니다.

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  <property name="location"><value>my_config.properties</value></property>  
  <property name="properties">  
    <props>  
      <prop key="entry.1">123</prop>  
    </props>  
  </property>  
</bean> 

thx, 봄 javadoc에 그것에 대한 단어가 있었지만 어떻게하는지 알 수 없었습니다!
Guillaume

0

또한 나를 위해 일하는 또 다른 솔루션을 찾습니다. 레거시 스프링 프로젝트에서는 사용자에게이 자체 구성을 사용할 수있는 가능성을 제공하기 위해이 방법을 사용합니다.

<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="false"/>
    <property name="locations">
        <list>
            <value>file:./conf/user.properties</value>
        </list>
    </property>
</bean>

이 속성에 액세스하려면 코드에서 다음과 같이 작성해야합니다.

@Value("#{appUserProperties.userProperty}")
private String userProperty

새 속성을 추가해야하지만 지금은 프로덕션 사용자 구성에 추가하고 싶지 않은 상황이 발생하면 모든 테스트 컨텍스트를 패치해야 할 때 매우 빠르게 지옥이됩니다. 그렇지 않으면 애플리케이션이 실패합니다. 시작.

이 문제를 처리하기 위해 다음 구문을 사용하여 기본값을 추가 할 수 있습니다.

@Value("#{appUserProperties.get('userProperty')?:'default value'}")
private String userProperty

저에게는 진정한 발견이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.