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

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

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

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



답변

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로 테스트 됨


답변

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

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

이 질문을 참조하십시오 .


답변

@vorburger 덕분에 :

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

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


답변

나는 “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 표기법 (이전 예제)을 사용할 것입니다 (개인 변수는 단위 테스트에서 설정하기 어렵습니다).


답변

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

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

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

일로


답변