如何编写一个Spring属性Converter使百分比翻倍



我想要一个Spring Boot应用程序将百分比绑定到intdouble属性,而无需对每个setter进行自定义解析。由于它没有通过NumberUtil内置的支持,这意味着使用他们的Converter API,但我找不到实现这一点的方法——增强Number/原语解析比简单地支持新类型更复杂。

我希望这个最小的例子能起作用,但如果解析50%返回50d而不是0.5d,我也会很高兴。。。

public class MyApp {
@Bean
public MyApp bean(@Value("50%") double percent, @Value("0.5") double real) {
assert percent == real;
return null;
}
public static void main(String[] args) { SpringApplication.run(MyApp.class, args); }
}

自我回答,因为没有人提出比定义定制类更好的建议。

这是一个笨拙的例子,你可以随心所欲地灵活解析/格式化,但使用静态valueOf(String)方法意味着它会被Spring(以及像Jackson这样的其他库(自动提取,而不需要任何进一步的定制转换器。

public class Percent {
public final double value;
public static Percent valueOf(String source) {
if ('%' == source.charAt(source.length() - 1)) {
return new Percent(Double.parseDouble(source.substring(0, source.length() - 1)) / 100);
}
throw new NumberFormatException(source + " not a percentage");
}
public Percent(double value) {
this.value = value;
}
@Override
public String toString() {
return Double.toString(value * 100) + '%';
}
}

最新更新