스프링 부트바인드 @Value to Enum 대소문자를 구분하지 않음
열거형
public enum Property {
A,
AB,
ABC;
}
들판
@Value("${custom.property}")
protected Property property;
application.properties(소문자)
custom.property=abc
응용 프로그램을 실행할 때 다음 오류가 발생합니다.
유형 [java.lang]의 값을 변환할 수 없습니다.[String]을(를) 필수 유형 [com]으로 설정합니다.xxx.Property]: 일치하는 에디터 또는 변환 전략을 찾을 수 없습니다.
반면(대문자):
custom.property=ABC
정상적으로 동작합니다.
값 대소문자를 구분하지 않고 바인드할 수 있는 방법이 있습니까?ABC, Abc, AbC, abc와 같이 어떤 패턴도 작동해야 합니다.
메모: Spring 3.0 MVC 바인딩 Enums 대소문자를 구분하는 질문을 보았습니다만, 제 경우 10개가 넘는 enum/value 클래스가 있고(더 많은 값을 가질 것으로 예상), 10개의 다른 커스텀 속성 바인더를 구현하려면 몇 가지 일반적인 솔루션이 필요합니다.
@Value그리고.@ConfigurationProperties기능이 일치하지 않습니다.어떻게 하는지 아무리 강조해도@ConfigurationProperties우월하다.
먼저 간단한 POJO로 구성을 설계할 수 있습니다.주석에 오타로 쉽게 깨질 수 있는 표현이 아니라 원하는 위치에 삽입할 수 있습니다.둘째, 메타데이터를 지원하므로 IDE에서 자신의 키를 자동 완성할 수 있습니다.
마지막으로, 문서에 기술된 완화된 바인딩은 다음에만 적용됩니다.@ConfigurationProperties.@Value는 스프링 프레임워크 기능으로, 바인딩이 느슨해지는 것을 인식하지 않습니다.우리는 그 문서를 통해 그것을 더 명확히 할 것이다.
TL;DRabc와 연동하다@ConfigurationProperties와는 안 된다@Value.
Configuration Propertis(afaik)의 문제는 컨스트럭터 주입을 사용할 수 없고 클래스가 변경 가능해야 한다는 것입니다.
회피책(또는 필요에 따라 해킹)은 SpEL을 사용하여 속성을 조회하기 전에 다음과 같이 대문자로 지정하는 것입니다.
@Value("#{'${custom.property}'.toUpperCase()}") Property property
enum 인스턴스는 상수이므로 항상 대문자로 정의해야 합니다.https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
실제 세계에서는, 이것은 효과가 있습니다.
public enum Property {
A, a
AB, ab,
ABC, abc,
ABCD, abcd,
ABCDE, abcde;
public boolean isA() {
return this.equals(A) || this.equals(a);
}
public boolean isAB() {
return this.equals(AB) || this.equals(ab);
}
...etc...
}
..이것으로 열거의 원칙이 깨지긴 하지만!
언급URL : https://stackoverflow.com/questions/35565758/spring-boot-bind-value-to-enum-case-insensitive
'programing' 카테고리의 다른 글
| 일반적으로 하나의 컴포넌트에 하나 또는 여러 개의 useEffect 훅을 사용하는 것이 좋습니까? (0) | 2023.03.27 |
|---|---|
| json 스키마에서 배열의 최소 크기를 정의하는 방법 (0) | 2023.03.27 |
| Wordpress 구텐베르크 미디어 업로드 비디오 갤러리 (0) | 2023.03.22 |
| React에서 사용자 세션을 관리하는 가장 좋은 방법은 무엇입니까? (0) | 2023.03.22 |
| Django REST Framework POST 중첩된 개체 (0) | 2023.03.22 |