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

时间:2016-02-22 23:10:08

标签: java spring spring-boot enums spring-properties

枚举

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 binding Enums Case Sensitive但在我的情况下,我有超过10个枚举/值(并且期望有更多)类并且实现10个不同的自定义属性绑定器会很痛苦,我需要一些通用的溶液

4 个答案:

答案 0 :(得分:13)

@Value@ConfigurationProperties功能不匹配。我无法强调@ConfigurationProperties的优越性。

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

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

TL; DR abc@ConfigurationProperties合作,但与@Value不相符。

答案 1 :(得分:3)

值区分大小写(考虑从环境注入的密钥或密码),宽松绑定仅适用于密钥。 Java枚举名称也区分大小写(Aa是不同的值),您不希望压缩大小写。

只需在配置属性中使用正确的大小写。

答案 2 :(得分:2)

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

一种解决方法(如果需要,也可以破解)是在查找之前使用SpEL将属性大写,例如:

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

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

答案 3 :(得分:-5)

在实际的世界中,这有效......

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

}

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