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

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

枚举

  1. public enum Property {
  2. A,
  3. AB,
  4. ABC;
  5. }

字符串

字段

  1. @Value("${custom.property}")
  2. protected Property property;

application.properties(小写)

  1. custom.property=abc


当我运行应用程序时,我有一个错误:
无法将类型[java.lang.String]的值转换为所需类型[com.xxx.Property]:找不到匹配的编辑器或转换策略。
而(大写):

  1. 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注入:

  1. protected Property property;
  2. @Autowired
  3. public void setProperty(@Value("${custom.property}") String propertyString) {
  4. this.property = Property.valueOf(propertyString.toUpperCase())
  5. }

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

  1. package com.example.enums
  2. public enum Property {
  3. A,
  4. AB,
  5. ABC;
  6. public static Property parse(String name) {
  7. // you can do more complicated processing here
  8. return valueOf(name.toUpperCase());
  9. }
  10. }
  1. @Value("#( T(com.example.enums.Property).parse('${custom.property}') )")
  2. protected Property property;

的数据

展开查看全部
gmol1639

gmol16394#

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

  1. public enum Property {
  2. A, a
  3. AB, ab,
  4. ABC, abc,
  5. ABCD, abcd,
  6. ABCDE, abcde;
  7. public boolean isA() {
  8. return this.equals(A) || this.equals(a);
  9. }
  10. public boolean isAB() {
  11. return this.equals(AB) || this.equals(ab);
  12. }
  13. ...etc...
  14. }

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

展开查看全部

相关问题