Spring如何将单位的配置值转换为自然数

时间:2019-07-15 13:51:32

标签: spring spring-boot

我可以将这些值添加到我的配置文件中:

server:
  tomcat:
    max-http-post-size: 1024MB

这有一个很大的优势,我可以写一个易于理解的数字而不用写100000000000。 但是,如果我想将其用于自己的配置值怎么办?

例如,这不起作用:

@Value("${server.tomcat.max-http-post-size}")
private Integer maxPostSize;

因为它产生:

Caused by: java.lang.NumberFormatException: For input string: "1024MB"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:na]
    at java.base/java.lang.Integer.parseInt(Integer.java:652) ~[na:na]
    at java.base/java.lang.Integer.valueOf(Integer.java:983) ~[na:na]
    at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:211) ~[spring-core-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.propertyeditors.CustomNumberEditor.setAsText(CustomNumberEditor.java:115) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:429) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:402) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:155) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:73) ~[spring-beans-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    ... 32 common frames omitted

我在Spring Boot 2.1.6上尝试过此操作。我知道如何使用自己的代码或某些库将1024MB之类的字符串转换为数字,但是想使用Spring Boots的方式。

1 个答案:

答案 0 :(得分:3)

答案很简单,那就不是。

示例属性

server:
  tomcat:
    max-http-post-size: 1024MB

是内部处理的,实际上将映射到代码中的String。然后,将字符串解析并适当地映射到long / integer。

因此,如果您想实现类似的功能,则通常必须执行类似的操作。另一个常见的模式是拥有一个名称中带有度量单位的属性。例如:

server.tomcat.max-http-post-size-mb: 1024

这使它很明确,尽管您失去了灵活性。

编辑:

快速阅读一下,结果发现,如果您将Spring更新到最新版本(从5.1+开始),则有一个名为DataSize的类,它实际上应该允许您将类似的字符串映射到另一个类。 / p>

如果升级spring版本,则应该可以声明该类型的类并添加@Value

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/unit/DataSize.html