20

枚举

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

工作正常。

有没有办法绑定值不区分大小写?像ABCAbcAbCabc任何模式都应该工作。

注意:我看到了这个问题 - Spring 3.0 MVC binding Enums Case Sensitive但在我的情况下,我有超过 10 个枚举/值(并且期望有更多)类,并且实现 10 个不同的自定义属性绑定器会很痛苦,我需要一些通用的解决方案.

4

3 回答 3

26

@Value@ConfigurationProperties功能不匹配。我怎么强调都不@ConfigurationProperties为过。

首先,您可以在一个简单的 POJO 中设计您的配置,您可以将其注入到您想要的任何位置(而不是在注释中使用很容易因拼写错误而中断的表达式)。其次,元数据支持意味着您可以很容易地 在 IDE 中自动完成您自己的密钥

最后,文档中描述的宽松绑定仅适用于@ConfigurationProperties. @Value是 Spring Framework 的一个特性,不知道宽松的绑定。我们打算在文档中更清楚地说明这一点

TL;DRabc适用于@ConfigurationProperties但不适用于@Value.

于 2016-02-23T08:02:47.113 回答
4

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

一种解决方法(或 hack,如果您愿意)是在查找之前使用 SpEL 将属性大写,如下所示:

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

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

于 2018-12-17T07:49:07.197 回答
-9

在实际世界中,这是可行的....

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

}

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

于 2017-08-30T08:20:02.363 回答