弹簧靴绑定@Value到枚举大小写不敏感

枚举

public enum Property {
    A,
    AB,
    ABC;
}

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

应用程序.属性(小写)

custom.property=abc

当我运行应用程序时,我遇到错误:

无法将类型 [java.lang.String] 的值转换为所需类型 [com.xxx.Property]: 找不到匹配的编辑器或转换策略。

鉴于(大写):

custom.property=ABC

工作正常。

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

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


答案 1

@Value和功能不匹配。我再怎么强调也不过分。@ConfigurationProperties@ConfigurationProperties

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

最后,文档中描述的宽松绑定仅适用于 。 是Spring框架的一个功能,并且不知道放松绑定。我们打算在文档中更清楚地说明这一点@ConfigurationProperties@Value

TL;DR 可与 一起使用,但不能与 .abc@ConfigurationProperties@Value


答案 2

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

解决方法(或者如果您愿意,也可以使用hack)在查找属性之前使用SpEL将其大写,如下所示:

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

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