无法使用@ConfigurationProperties读取yaml的复杂对象。整数不能转换为String

时间:2018-01-03 04:12:47

标签: spring spring-boot annotations yaml lombok

我正在尝试阅读此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,但没有运气。

2 个答案:

答案 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

创建了一个示例项目

并确认此行引发异常:https://github.com/spring-projects/spring-boot/blob/1.5.x/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedDataBinder.java#L328

如您所见,key被输入String,这是异常的根本原因。我不确定这是否合法使用,因为我从未想过Integer关键。