Spring Boot 将 @Value 绑定到不区分大小写的 Enum

新手上路,请多包涵

枚举

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 个不同的自定义属性绑定器会很痛苦,我需要一些通用的解决方案.

原文由 Mikhail Kholodkov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

@Value@ConfigurationProperties 功能不匹配。我怎么强调 @ConfigurationProperties 是多么的优越。

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

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

TL;DR abc 适用于 @ConfigurationProperties 但不适用于 @Value

原文由 Stephane Nicoll 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

一种变通方法(或者如果你愿意的话可以 hack)是在查找之前使用 SpEL 将属性大写,如下所示:

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

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

原文由 Morten Berg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题