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

Mik*_*kov 13 java enums spring spring-boot spring-properties

枚举

public enum Property {
    A,
    AB,
    ABC;
}
Run Code Online (Sandbox Code Playgroud)

领域

@Value("${custom.property}")
protected Property property;
Run Code Online (Sandbox Code Playgroud)

application.properties(小写)

custom.property=abc
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,我有一个错误:

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

鉴于(大写):

custom.property=ABC
Run Code Online (Sandbox Code Playgroud)

工作良好.

有没有办法绑定值不区分大小写的值?像ABC,Abc,AbC,abc任何模式都应该有效.

注:我看到这个问题- 春季3.0 MVC结合枚举大小写敏感的,但在我的情况我有超过10枚举/值(并期望有更多)班,并实施10层不同的自定义属性的粘合剂将是痛苦的,我需要一些通用的解决方案.

Ste*_*oll 13

@Value@ConfigurationProperties功能不匹配.我不能强调如何@ConfigurationProperties优越.

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

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

TL; DR abc可以使用,@ConfigurationProperties但不会使用@Value.


Mor*_*erg 8

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

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

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

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