source

Spring @Value 주석에서 기본값을 올바르게 지정하는 방법은 무엇입니까?

lovecheck 2023. 8. 15. 11:13
반응형

Spring @Value 주석에서 기본값을 올바르게 지정하는 방법은 무엇입니까?

처음에는 다음과 같은 사양을 가지고 있습니다.

@Value("#{props.isFPL}")
private boolean isFPL=false;

속성 파일에서 값을 가져오면 올바르게 작동합니다.

isFPL = true

그러나 다음 식을 기본값으로 사용하면 오류가 발생합니다.

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

식을 구문 분석하지 못했습니다. 중첩된 예외는 org.springframework.expression.spel입니다.SpellParseException: EL1041E:(pos28): 유효한 식을 구문 분석한 후에도 'colon(:)' 식에 더 많은 데이터가 있습니다.

저도 # 대신 $를 사용하려고 했습니다.

@Value("${props.isFPL:true}")
private boolean isFPL=false;

그러면 주석의 기본값은 정상적으로 작동하지만 속성 파일에서 올바른 값을 가져오지 못했습니다.

사용해 보십시오.$다음과 같이:

@Value("${props.isFPL:true}")
private boolean isFPL=false;

또한 다음을 설정해야 합니다.ignore-resource-no-foundtrue로 설정하면 속성 파일이 누락된 경우 기본값이 사용됩니다.

XML 기반 구성을 사용하는 경우 컨텍스트 파일에 다음을 배치합니다.

<context:property-placeholder ignore-resource-not-found="true"/>

Java 구성을 사용하는 경우:

 @Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }

위해서int유형 변수:

@Value("${my.int.config: #{100}}")
int myIntConfig;

참고: 대장 앞에는 공백이 없고 대장 뒤에는 여분의 공간이 있습니다.

질문의 정확한 대답은 매개 변수의 유형에 따라 다릅니다.

'String' 매개 변수의 경우 샘플 코드가 잘 작동합니다.

@Value("#{props.string.fpl:test}")
private String fpl = "test";

다른 유형(예: 질문의 부울)의 경우 다음과 같이 작성해야 합니다.

@Value("${props.boolean.isFPL:#{false}}")
private boolean isFPL = false;

또는 '정수'의 경우:

@Value("${props.integer.fpl:#{20}}")

Spring 응용프로그램 컨텍스트 파일에 아래와 같은 두 개 이상의 속성 Placeholder 빈이 포함되어 있습니까?

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

경우 props.isFPL에 대한 속성 조회가 첫 번째 속성 파일(.local.properties)에 대해서만 수행되고, 속성을 찾을 수 없으면 기본값(true)이 적용되며 두 번째 속성 파일(config.properties)은 이 속성에 대해서는 사실상 무시됩니다.

문자열의 경우 다음과 같이 null로 기본 설정할 수 있습니다.

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}

속성을 로드하는 방법에 따라 다릅니다. 다음과 같은 방법을 사용할 경우

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

그리고나서@Value처럼 보여야 합니다.

@Value("${isFPL:true}")

기본값이 문자열인 경우 다음과 같이 지정합니다.

@Value("${my.string.config: #{'Default config value'}}")
String myIntConfig;

기본값을 정의하는 이 방법은 @Value 주석에 "value=..."를 쓰는 경우에만 작동합니다.

작동하지 않음: @Value("${testUrl:some-url}" // 구성 파일에서 수행하는 작업에 관계없이 항상 "some-url"이 설정됩니다.

작동: @Value(값 = "${testUrl:some-url}" // 구성 파일에 testUrl 속성이 없는 경우에만 "some-url"이 설정됩니다.

언급URL : https://stackoverflow.com/questions/26916598/how-to-correctly-specify-a-default-value-in-the-spring-value-annotation

반응형