java Sping Boot bind @Value to Enum不区分大小写

sqxo8psd  于 2023-08-01  发布在  Java
关注(0)|答案(4)|浏览(167)

枚举

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

fv2wmkja

fv2wmkja1#

@Value@ConfigurationProperties功能不匹配。我不能强调@ConfigurationProperties是多么上级。
首先,您可以在一个简单的POJO中设计您的配置,您可以在任何您想要的地方注入(而不是在注解中使用表达式,您可以很容易地通过输入错误中断)。其次,元数据支持意味着您可以在IDE中非常轻松地为您自己的键自动完成。
最后,文档中描述的宽松绑定仅适用于@ConfigurationProperties@Value是Spring Framework的一个特性,不知道松弛绑定。我们intend to make that more clear in the doc
TL;DR abc可与@ConfigurationProperties配合使用,但不能与@Value配合使用。

eoxn13cs

eoxn13cs2#

ConfigurationPropertytis(afaik)的一个问题是不能使用构造函数注入,并且类必须是可变的。
一个解决方案(或者如果你喜欢的话)是在查找之前使用SpEL将属性大写,像这样:
第一个月
这应该是可行的,因为枚举示例是常量,并且应该始终以大写形式定义:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

5f0d552i

5f0d552i3#

另一种选择是setter注入:

protected Property property;

@Autowired
public void setProperty(@Value("${custom.property}") String propertyString) {
  this.property = Property.valueOf(propertyString.toUpperCase())
}

字符串
它比SpEL更加冗长,但它允许您进行更复杂的处理
您也可以将SpEL与自定义解析函数相结合:

package com.example.enums

public enum Property {
  A,
  AB,
  ABC;

  public static Property parse(String name) {
    // you can do more complicated processing here
    return valueOf(name.toUpperCase());
  }

}
@Value("#( T(com.example.enums.Property).parse('${custom.property}') )")
protected Property property;

的数据

gmol1639

gmol16394#

在现实世界中,这是可行的...

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...

}

字符串
..虽然这确实违反了枚举的原则!

相关问题