programing

Spring의 @Value 주석에 여러 속성 이름을 지정할 수 있습니까?

css3 2023. 9. 7. 21:58

Spring의 @Value 주석에 여러 속성 이름을 지정할 수 있습니까?

스프링스의 기본적인 행동에 대해서는 이미 잘 알고 있습니다.@Value다음과 같이 필드를 프로젝트 속성의 값으로 설정하는 주석:

프로젝트 속성 파일

foo.bar=value

프로젝트의 구성 클래스

@Configuration
public class MyConfig {
    @Value("${foo.bar}")
    private String myValue;
}

다만 조건부 구성으로 SpringBoot starter 프로젝트를 만들려고 하는데, 속성 이름을 "com.mycompany.propertygroup.propertyname"과 같이 유용한 것으로 표준화하고 싶지만, 전환을 용이하게 하고 채택을 장려하기 위해 이전 속성 이름도 당분간 지원하고 싶습니다.그래서 여러 개의 부동산 이름이 같은 필드를 설정할 수 있는 방법이 없을까 생각하고 있었습니다.예를 들어 다음과 같습니다.

나의 이론적 시동장치 구성

@Configuration
public class MyConfig {
    @Value("${com.mycompany.propertygroup.propertyname}" || "${oldconvention.property}")
    private String myValue;
}

프로젝트 A의 속성

oldconvention.property=value

프로젝트 B의 속성

com.mycompany.propertygroup.propertyname=value

이것이 가능한지 여부와 가능하다면 어떻게 할 것인지에 대한 문서나 SO 답변을 찾을 수 없는 것 같습니다.그래서 그게 가능한지 아니면 가능하지 않은 것인지, 아니면 대안이 있는지 궁금합니다.@Value동일한 효과를 얻기 위해 사용할 수 있는 주석?

편집하여 명확히 하기:여러 값을 추적하고 싶지 않아서 여러 값을 얻는 방법에 대한 지침이 필요하지 않습니다.목표는 이름이 여러 개일 수 있는 단일 값으로 통합하는 것입니다.실제로는 스타터를 사용하는 프로젝트당 하나의 이름값만 가질 수 있습니다.누군가가 이전 재산을 삭제하는 것을 잊어버린 경우에 드물게만 각 재산 이름이 사용될 것입니다(그리고 그것은 어쨌든 동일한 값을 가질 것입니다)이러한 경우에는 새 협약 이름 값이 유일하게 사용됩니다.

갱신하다

제공된 SpEL 표현식 응답은 두 속성이 모두 있을 때 작동하지만, 속성 이름 중 하나만 있을 때는 응용 프로그램 컨텍스트를 로드할 수 없습니다.예:

업데이트된 구성 클래스

@Value("#{'${com.mycompany.propertygroup.propertyname}' != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}"
private String myProperty;

업데이트된 속성 파일

com.mycompany.propertygroup.propertyname=somevalue

오류

Caused by: java.lang.IllegalArgumentException: 
Could not resolve placeholder 'oldconvention.propertyname' in value
"#{'${com.mycompany.propertygroup.propertyname}' != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}"

두 개의 부동산 이름을 모두 사용하도록 요구하는 것은 이전 협약이나 새 협약을 사용하여 이 스타터를 구성하는 프로젝트를 실행할 수 있도록 허용하는 목적에 위배됩니다.

다른 업데이트...

SpEL 표현을 좀 가지고 놀았는데, 부동산이 있을 때와 없을 때 조건부 체크가 작동하고 있지만, 사후에 부동산 해결에 어려움을 겪고 있습니다.속성 기본값과 복잡한 SpEL 표현이 잘 어울리지 않는 것이 문제라고 생각합니다.

@Value("#{${com.mycompany.propertygroup.propertyname:null} != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.propertyname}'}")
private String myProperty;

위와 같이 SpEL이 작성되면 속성 자리 표시자 예외를 해결할 수 없습니다. 이는 SpEL 식을 평가하기 위해 두 속성이 모두 존재해야 함을 의미합니다. 본 할 수. 즉,는을기해본본다할게수고을서성다게ot고sr:서l수x,eiyt는할gei을t을idg@Value("${myoptionalproperty:defaultValue}")

다음은 SpEL 식과 기본 속성 해상도를 결합하려는 시도입니다.

@Value("#{${com.mycompany.propertygroup.propertyname:null} != null ? '${com.mycompany.propertygroup.propertyname:}' : '${oldconvention.propertyname:}'}")
private String myProperty;

기본 속성 표기법을 사용하면 다음과 같은 오류가 계속 나타납니다.

org.springframework.expression.spel.SpelParseException: 
EL1041E: After parsing a valid expression, there is still more data in the expression: 'colon(:)'

구글에서 그 오류를 검색했을 때, 일반적인 답은 부동산을 작은 따옴표로 묶어야 문자열로 평가할 수 있다는 것이었습니다.하지만 이미 싸여있어요 (첫번째 것은 제외하고는..null check(null check)에 대해 문자 그대로 null(null)로 평가하기를 원했기 때문에 그것의 포장을 풀어야 했습니다.그래서 기본값은 맞춤법으로 감싸면 속성과 함께 사용할 수 없다고 생각합니다.실,이어는을본다이을atnry다tne,이실ni'ye,h는본을본이어는@Value주석은 순수 속성 홀더로만 설정되며 SpEL 식에 사용되는 모든 속성은 기본 설정이 없었습니다.

과 같은 을 를 할 수 .@Value주석:

@Configuration
public class MyConfig {

    @Value("#{'${com.mycompany.propertygroup.propertyname:${oldconvention.propertyname:}}'}")
    private String myValue;
}

은.@Value석을 사용합니다.com.mycompany.propertygroup.propertyname고이과은우우은otf고과이sdsoldconvention.property한다면com.mycompany.propertygroup.propertyname제공되지 않습니다. 다 속성은 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δnull하여 이 할 수 . . 를 을 으로 할 하여 할 으로 .null또 다른 가치를 지닌

자세한 내용은 다음을 참조하십시오.


값을 반환하기 전에 두 값을 모두 캡처하여 선택할 수도 있습니다.

@Configuration
public class MyConfig {

    @Value("${com.mycompany.propertygroup.propertyname:}")
    private String newValue;

    @Value("${oldconvention.propertyname:}")
    private String oldValue;

    public String getValue() {

        if (newValue != null && !newValue.isEmpty()) {
            // New value is provided
            System.out.println("New Value: " + newValue);
            return newValue;
        }
        else {
            // Default to the old value
            return oldValue;
       }
    }
}

이를 해결하기 위해서는 SPEL을 사용하는 것이 가장 좋습니다.이 방법이 효과가 있을 것입니다.

@Value("#{'${com.mycompany.propertygroup.propertyname}' != null ? '${com.mycompany.propertygroup.propertyname}' : '${oldconvention.property}'}")
private String myValue;

아니요, 그럴 리는 없겠지만 네, 속성은 쉼표로 구분된 것으로 정의할 수 있습니다.를 들어com.mycompany.propertygroup.propertyname=value1,value2,value3

String 을 에 주석을 달 수 있습니다.@Value에 걸쳐서String[]다음과 같이:

@Value("#{'${com.mycompany.propertygroup.propertyname}'.split(',')}")
private String[] propertyNames;

하고 와 을 된 로 에 하고 할 로 할 하고 에 와 을 @Value할에 수 있는 수는석석는수t할Map들어 를 을 로 을 로 하고자 에 과 을 할 할 을 과 에 를

group.details.property= {'group1':'group1.details','group2':'group2.details'}

그리고 당신은 주석을 달 수 있습니다.@Value~하듯이

@Value("#{${group.details.property}}")
private Map<String, String> groupMap;

언급URL : https://stackoverflow.com/questions/49653241/can-multiple-property-names-be-specified-in-springs-value-annotation