我们的项目里有一个rest接口,参数分别为数字表示的年和月, 比如: http://xxx/xxx?year=2016&month=06, 本来一直用得好好的, 到8月份突然就不行了, 提示错误
org.nutz.castor.FailToCastObjectException: Fail to cast '08' to <java.lang.Integer>
后来发现只有8月和9月不行, 其他月份都可以, 猜测可能是进制判断引起的, 按照源码调试了一下, 果然如此:
protected Integer valueOf(String str) {
Nums.Radix ni = Nums.evalRadix(str);
return Integer.valueOf(ni.val, ni.radix);
}
public static Radix evalRadix(String str) {
if (str.startsWith("0x"))
return new Radix(str.substring(2), 16);
if (str.startsWith("0") && str.length() > 1)
return new Radix(str.substring(1), 8);
if (str.startsWith("0b"))
return new Radix(str.substring(2), 2);
return new Radix(str, 10);
}
可以看出在转换之前先要判断进制, 而如果字符串以'0'开头,又大于1位,就会被判断为8进制, 这样的话, 00~07都是合法数字, 而且跟10进制的数字值相同, 不会引起错误, 而从'10'开始, 数字不以0开头了, 又会被判断为10进制, 都不会出现问题, 只有'08','09', 被判断为非法的8进制数字。
解决方法为调用接口之前先处理一下,把多余的0去掉了,形如: http://xxx/xxx?year=2016&month=8