[英]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
当我运行应用程序时,我有一个错误:
无法将[java.lang.String]类型的值转换为必需的类型[com.xxx.Property]:找不到匹配的编辑器或转换策略。
鉴于(大写):
custom.property=ABC
工作良好。
有没有办法绑定值不区分大小写的值? 像ABC , Abc , AbC , abc任何模式都应该有效。
注意:我看到了这个问题 - Spring 3.0 MVC绑定Enums区分大小写,但在我的情况下,我有超过10个枚举/值(并期望有更多)类并实现10种不同的自定义属性绑定器会很痛苦,我需要一些通用的解决方案。
@Value
和@ConfigurationProperties
功能不匹配。 我无法强调@ConfigurationProperties
如何优越。
首先,您可以在一个简单的POJO中设计您的配置,您可以在任何地方注入(而不是在注释中使用表达式,您可以轻松打破拼写错误)。 其次,元数据支持意味着您可以非常轻松地 在IDE中自行完成自己的密钥 。
最后,doc中描述的宽松绑定仅适用于@ConfigurationProperties
。 @Value
是一个Spring Framework功能,并不知道轻松绑定。 我们打算在文档中更清楚地说明 。
TL; DR abc
与@ConfigurationProperties
但不与@Value
一起@Value
。
值区分大小写(考虑从环境注入的密钥或密码),宽松绑定仅适用于密钥。 Java枚举名称也区分大小写( A
和a
是不同的值),您不希望压缩大小写。
只需在配置属性中使用正确的大小写即可。
ConfigurationPropertis(afaik)的一个问题是你不能使用构造函数注入,并且你的类必须是可变的。
一个变通方法(或者如果你愿意,也可以使用hack)在查找之前使用SpEL来大写属性,如下所示:
@Value("#{'${custom.property}'.toUpperCase()}") Property property
这应该有效,因为枚举实例是常量,并且应始终以大写形式定义: https : //docs.oracle.com/javase/tutorial/java/javaOO/enum.html
在实际的世界中,这是有效的......
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...
}
..这确实打破了枚举的原则!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.