programing

스프링 부트바인드 @Value to Enum 대소문자를 구분하지 않음

mailnote 2023. 3. 22. 21:50
반응형

스프링 부트바인드 @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

반응형