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
枚举
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