Spring에서 @Value의 기본값으로 null을 설정할 수 있습니까?


100

현재 다음과 같이 @Value Spring 3.1.x 주석을 사용하고 있습니다.

@Value("${stuff.value:}")
private String value;

속성이없는 경우 빈 문자열을 변수에 넣습니다. 빈 문자열 대신 기본값으로 null을 사용하고 싶습니다. 물론 stuff.value 속성이 설정되지 않은 경우 오류를 피하고 싶습니다.

답변:


66

PropertyPlaceholderConfigurer 의 nullValue를 설정해야합니다 . 예를 들어 문자열을 사용하고 @null있지만 빈 문자열을 nullValue로 사용할 수도 있습니다.

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- config the location(s) of the properties file(s) here -->
    <property name="nullValue" value="@null" />
</bean>

이제 문자열 @null을 사용 하여 null값 을 나타낼 수 있습니다.

@Value("${stuff.value:@null}")
private String value;

참고 : 컨텍스트 네임 스페이스는 현재 null 값을 지원하지 않습니다. 당신은 사용할 수 없습니다

<context:property-placeholder null-value="@null" ... />

Spring 3.1.1로 테스트 됨


2
이것에 상응하는 Java 구성은 무엇입니까?
Kumar Sambhav

30
stackoverflow.com/questions/9347929/… $ {some.param : # {null}} 사용에 대해 언급했으며 nullValue를 설정하지 않고도 저에게 효과적이었습니다. 이것이 기본값 인 것 같습니다. (Spring Boot 애플리케이션에서.)
vorburger 2014 년


ben3000 및 JRichardsz 답변에는 훨씬 적은 구성이 필요한 것 같습니다.
Jeff

198

이것은 정말 오래되었지만 이제 Spring EL을 사용할 수 있습니다.

@Value("${stuff.value:#{null}}")

이 질문을 참조하십시오 .


52

@vorburger 덕분에 :

@Value("${email.protocol:#{null}}")
String protocol;

다른 구성없이 문자열 값을 null로 설정합니다.


3
지난 2019 년 봄 부팅 버전 : 2.1.7.RELEASE ... start.spring.io
JRichardsz

2

나는 "null-value"에 대해 몰랐기 때문에 @nosebrain 신용을 부여하지만 null, 속성 파일에서 표현하기가 어려우므로 특히 null 값을 사용하지 않는 것을 선호 합니다.

그러나 여기에 null을 사용하는 대안이 null-value있으므로 속성 자리 표시 자와 함께 작동합니다.

public class MyObject {

   private String value;

   @Value("${stuff.value:@null}")
   public void setValue(String value) {
      if ("@null".equals(value)) this.value = null;
      else this.value = value;
   }
}

개인적으로 저는 나중에 stuff.value쉼표로 구분 된 값 이되기를 원 하거나 Enum 스위치가 더 쉽기 때문에 내 방식을 선호합니다 . 단위 테스트도 더 쉽습니다. :)

편집 : 열거 형 사용에 대한 귀하의 의견과 null을 사용하지 않는다는 의견을 기반으로합니다.

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

위의 내용이 잘 작동합니다. null을 피합니다. 속성 파일이 그것을 처리하고 싶지 않다고 명시 적으로 설정하고 싶다면 그렇게합니다 ( 그러나 기본값은 NOTSET이므로이를 지정할 필요조차 없습니다 ).

crap=NOTSET

null매우 나쁘고와 다릅니다 NOTSET. 그것은 봄 또는 단위 테스트가 설정하지 않았 음을 의미하므로 IMHO에 차이가 있습니다. 나는 여전히 단위 테스트가 더 쉽기 때문에 setter 표기법 (이전 예제)을 사용할 것입니다 (개인 변수는 단위 테스트에서 설정하기 어렵습니다).


String 값은 예제였습니다. Enum 값에이 값이 필요했습니다. 빈 문자열은 변환 오류를 발생시킵니다. @null을 사용하면 "no Enum set"로 null을 가질 수 있습니다. 이것이 제가 필요한 것입니다.
Kevin Schmidt

내가 null을 권장하지 않고 대신 설정되지 않은 열거 형을 권장하는 이유가 더 많습니다.
Adam Gent

2
즉 (> 30), 거의 혜택과 함께 작업을 많이 보인다 ... 모든 속성 파일에 Enum.NOTSET를 넣어 필요
케빈 슈미트

나는 이것을 시도하지 않았지만 이론적으로는 @Value("${stuff.value:NOTSET}")작동 하지 않을까요?
Adam Gent

예, 이것은 좋은 해결책입니다. 불행히도 enum (dep)을 변경할 수 없으므로 null로 이동해야합니다. 그렇지 않으면 당신이 옳다면 NOTSET이 작동합니다.
Kevin Schmidt

0

@Value 기본값으로 빈 (길이 0) ""문자열을 삽입해야하는 경우 다음과 같이 SPEL (스프링 표현식 언어)을 사용하십시오.

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

# { ''}은 @Value의 기본값이 삽입 된 빈 문자열을 가져옵니다.

일로

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