枚举
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条答案
按热度按时间fv2wmkja1#
@Value
和@ConfigurationProperties
功能不匹配。我不能强调@ConfigurationProperties
是多么上级。首先,您可以在一个简单的POJO中设计您的配置,您可以在任何您想要的地方注入(而不是在注解中使用表达式,您可以很容易地通过输入错误中断)。其次,元数据支持意味着您可以在IDE中非常轻松地为您自己的键自动完成。
最后,文档中描述的宽松绑定仅适用于
@ConfigurationProperties
。@Value
是Spring Framework的一个特性,不知道松弛绑定。我们intend to make that more clear in the doc。TL;DR
abc
可与@ConfigurationProperties
配合使用,但不能与@Value
配合使用。eoxn13cs2#
ConfigurationPropertytis(afaik)的一个问题是不能使用构造函数注入,并且类必须是可变的。
一个解决方案(或者如果你喜欢的话)是在查找之前使用SpEL将属性大写,像这样:
第一个月
这应该是可行的,因为枚举示例是常量,并且应该始终以大写形式定义:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
5f0d552i3#
另一种选择是setter注入:
字符串
它比SpEL更加冗长,但它允许您进行更复杂的处理
您也可以将SpEL与自定义解析函数相结合:
的数据
gmol16394#
在现实世界中,这是可行的...
字符串
..虽然这确实违反了枚举的原则!