Spring 引导绑定 @Value 到 Enum 不区分大小写

Spring Boot bind @Value to Enum case insensitive

枚举

public enum Property {
    A,
    AB,
    ABC;
}

字段

@Value("${custom.property}")
protected Property property;

application.properties(小写)

custom.property=abc

当我在 运行 应用程序时出现错误:

Cannot convert value of type [java.lang.String] to required type [com.xxx.Property]: no matching editors or conversion strategy found.

鉴于(大写):

custom.property=ABC

工作正常。

有没有办法绑定不区分大小写的值?像 ABC, Abc, AbC, abc 任何模式应该可以。

注意:我看到了这个问题 - Spring 3.0 MVC binding Enums Case Sensitive 但在我的例子中,我有超过 10 个 enums/values(并且期望有更多)类 并实现 10 个不同的自定义 属性 活页夹会很痛苦,我需要一些通用的解决方案。

@Value@ConfigurationProperties 特征不匹配。我怎么强调 @ConfigurationProperties 的优越性都不为过。

首先,您可以在一个简单的 POJO 中设计您的配置,您可以将其注入到您想要的任何位置(而不是在注释中使用容易因打字错误而中断的表达式)。其次,元数据支持意味着您可以 非常轻松地 get auto-completion in your IDE for your own keys.

最后,文档中描述的宽松绑定仅适用于 @ConfigurationProperties@Value 是一个 Spring 框架功能,并且不知道松散绑定。我们intend to make that more clear in the doc.

TL;DR abc 适用于 @ConfigurationProperties 但不适用于 @Value.

在实际世界中,这行得通....

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...

}

..虽然这确实打破了枚举的原则!

ConfigurationPropertis (afaik) 的一个问题是您不能使用构造函数注入,并且您的 class 必须是可变的。

一个变通方法(或者如果你喜欢的话可以破解)是在查找之前使用 SpEL 将 属性 大写,如下所示:

@Value("#{'${custom.property}'.toUpperCase()}") Property property

这应该可行,因为枚举实例是常量,并且应始终以大写形式定义:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html