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
'programing' 카테고리의 다른 글
클릭 시 부트스트랩 드롭다운을 열어 둡니다. (0) | 2023.09.07 |
---|---|
GROUP BY가 없는 집계 쿼리 (0) | 2023.09.07 |
MySQL - 사용자의 선택에 따라 열 '이름'을 선택합니다. 열 'id'와 'parent'의 행이 동일한 경우 (0) | 2023.09.07 |
JSF 동적에는 Ajax 요청 사용이 포함됩니다. (0) | 2023.09.07 |
Safari ajax request Failed to load resource: The network connection was lost (0) | 2023.09.07 |