我正在尝试阅读此yml文件
dist-price:
1234:
foo: 4567
bar: false
并投入本课程。 (我正在使用Lombok和Spring Boot v1.5.4.RELEASE)
@Repository
@ConfigurationProperties
@Data
@NoArgsConstructor
public class WebConfigProperty {
@NonNull
private TreeMap<Integer, Bound> distPrice;
}
@Data
@NoArgsConstructor
public class Bound {
@NonNull
private Integer foo;
@NonNull
private Boolean bar;
}
但我收到了这个错误。
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at java.lang.String.compareTo(Unknown Source)
at java.util.TreeMap.getEntry(Unknown Source)
at java.util.TreeMap.get(Unknown Source)
at org.springframework.boot.bind.RelaxedDataBinder.isBlanked(RelaxedDataBinder.java:328)
at org.springframework.boot.bind.RelaxedDataBinder.initializePath(RelaxedDataBinder.java:283)
at org.springframework.boot.bind.RelaxedDataBinder.normalizePath(RelaxedDataBinder.java:259)
at org.springframework.boot.bind.RelaxedDataBinder.modifyProperty(RelaxedDataBinder.java:240)
at org.springframework.boot.bind.RelaxedDataBinder.modifyProperties(RelaxedDataBinder.java:155)
at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:128)
at org.springframework.validation.DataBinder.bind(DataBinder.java:740)
at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:272)
at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240)
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:329)
... 73 common frames omitted
如果我将TreeMap<Integer, Bound>
更改为TreeMap<String, Bound>
,则可以正常使用。但我真的需要使用Integer
。似乎TreeMap
的密钥(在这种情况下:1234
)被强制转换为String
。我不知道为什么。
TreeMap<Integer, Bound>
TreeMap<Integer, Integer>
时很好,而yml就是这样。
dist-price:
1234: 4567
编辑:我尝试过Spring Boot v1.5.9.RELEASE
,但没有运气。
答案 0 :(得分:1)
这与@ConfigurationProperties
无关,而是与YAML处理密钥的方式无关。 YAML中的键默认为String
,所以如果你真的想在那里使用整数,你必须以某种方式强制它。
有几种记录方法可以做到这一点,引用应该起作用但对我不起作用(&#39; 1234&#39;给了我234回复!)。使用!!int
强制整数
dist-price:
!!int 1234:
foo: 4567
bar: false
答案 1 :(得分:1)
我从问题https://github.com/izeye/so-48071057
创建了一个示例项目如您所见,key
被输入String
,这是异常的根本原因。我不确定这是否合法使用,因为我从未想过Integer
关键。