@Value를 선택 사항으로 정의하는 방법


119

스프링 빈에 다음이 있습니다.

@Value("${myValue}")
private String value;

값이 올바르게 주입되었습니다. 그러나 변수는 선택 사항이어야하며 명령 줄 매개 변수로 전달되며 ( SimpleCommandLinePropertySource를 사용하여 Spring 컨텍스트에 추가됨 )이 인수가 항상 존재하는 것은 아닙니다.

기본값을 제공하기 위해 다음 두 가지를 모두 시도했습니다.

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

그러나 각각의 경우, 실제 값이 있더라도 콜론 뒤의 기본 인자가 주입됩니다. 이것은 Spring이 주입해야하는 것을 덮어 씁니다.

@Value 가 필요하지 않음 을 지정하는 올바른 방법은 무엇입니까 ?

감사


매우 이상합니다. 기본값은 기본값으로 만 작동해야합니다 (즉, 속성이 정의되지 않은 경우). "실제 값이있는 경우에도 기본값이 주입됩니다"(예 : 오래된 컴파일 된 클래스가없는 경우) 문을 다시 확인할 수 있습니까?
Pavel Horal 2014

7
@Value("${some.prop:}")나를 위해 작동합니다. 이것이 해당 변수에 대한 유일한 주석입니다.
Zarathustra

애플리케이션 구성을 게시 할 수 있습니까?
Vladimir Vagaytsev

@Autowired (필수 = false)?
Andrew Scott Evans

답변:


179

@Value가 필요하지 않음을 지정하는 올바른 방법은 무엇입니까?

'필요하지 않음'이라는 가정하에 작업하면 null...

:문자 오른쪽에 기본값을 제공 할 수 있음을 올바르게 지적했습니다 . 귀하의 예는 @Value("${myValue:DEFAULT}").

기본값은 일반 문자열로 제한되지 않습니다. SPEL 표현식을 사용할 수 있으며 리턴 할 간단한 SPEL 표현식 null은 다음과 같습니다.

@Value("${myValue:#{null}}")

49

Java 8을 사용하는 경우 해당 java.util.Optional클래스를 활용할 수 있습니다 . 다음과 같이 변수를 선언하면됩니다.

@Value("${myValue:#{null}}")
private Optional<String> value;

그런 다음 값이 더 좋은 방식으로 정의되었는지 여부를 확인할 수 있습니다.

if (value.isPresent()) {
    // do something cool
}

도움이 되었기를 바랍니다.


4
intelliJ 아이디어에 따르면. Optional클래스 필드에서 유형 을 사용하는 것은 모범 사례가 아닙니다 .
Fırat KÜÇÜK

2
이 작업을 수행하면 NPE가 발생합니다. valuenull입니다.
aatk

1
@aatk 설명하신 문제는 적어도 4.3.13 이후 수정 된 것 같습니다. 설명 된 선언을 사용하는 데 문제가 없습니다. : 그것은 단지 널 (NULL) 값을 사용하는 것이 좋습니다 있지만 blog.joda.org/2015/08/...
의 Torben

2
"intelliJ 아이디어에 따르면. 클래스 필드에서 선택적 유형을 사용하는 것은 모범 사례가 아닙니다." Optional을 인스턴스 변수로 사용하는 것이 잘못된 것은 무엇입니까? 게터에서 사용할 때에 비해 상대적으로 수명이 긴 것뿐입니다. 이러한 필드는 직렬화를 위해 Transient로 표시되어야합니까?
Andrey M. Stepanov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.