日志:
[INFO-2016/08/04/16/:21/:25]ProjectCommonFormController.(78) - 審批[同意]入參-[string]commonFormDtoStr ===={"commonForm":{"id":"1101115577946385"},"taskId":"322055","wfInstanceId":"1101115577859311","content":"","businessKey":"1101115577946385","projectId":"null","cityId":"null"} [ERROR-2016/08/04/16/:21/:25]XXXXFormController.(91) - 審批流程出錯!For input string: "null" com.alibaba.fastjson.JSONException: For input string: "null" at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:467) at com.alibaba.fastjson.JSON.parseObject(JSON.java:206) at com.alibaba.fastjson.JSON.parseObject(JSON.java:166) at com.alibaba.fastjson.JSON.parseObject(JSON.java:287) at com.boa.weixin.controller.costmanager.expenses.ProjectCommonFormController.approvalCommonForm(ProjectCommonFormController.java:79) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606)
................... Caused by: java.lang.NumberFormatException: For input string: "null" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Long.parseLong(Long.java:441) at java.lang.Long.parseLong(Long.java:483) at com.alibaba.fastjson.util.TypeUtils.castToLong(TypeUtils.java:361) at com.alibaba.fastjson.parser.deserializer.LongFieldDeserializer.parseField(LongFieldDeserializer.java:44) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:81) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer$InnerJavaBeanDeserializer.parseField(ASMJavaBeanDeserializer.java:92) at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:231) at com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer.deserialze(ASMJavaBeanDeserializer.java:31) at Fastjson_ASM_CommonFormDto_67.deserialze(Unknown Source) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:463)
分析:
在springmvc的使用中, 前后台傳參時, 對后台的DTO對象進行參數綁定,如果是基本類型的包裝類, 例如:Integer , Long等等...
開發時要注意控制前端的入參. 做好控制,避免傳入"null", "undefined","none"類似的字符串與數值類型映射
.
另外, 數字字符串可以轉換成整型
包裝類
, 類似: "1231231321" , "12"
字符類型的串可以轉換成整型
包裝類
, 類似: 'a', '8', '#'
其他的非數字字符串不可以轉換成整型包裝類,如按照常規的轉換(Integer in = Integer.parseInt("null"))或拋出
NumberFormatException類似的轉換異常.
類似: "asdfasd", "123AA", "b"," "(空格串),""(注意是空串),
當自己需要進行類型轉換時可以考慮先通過正則匹配來目標字符串是否滿足轉換條件, , 滿足條件則 通過BigDecimal對象來構造,
獲取目標類型的取值.
步驟: 正則匹配 String str , if(滿足轉換正則條件){ BigDecimal data = new BigDecimal(str); return data.IntegerValue(); }
spring的
ConversionService可以簡要的demo一下.
demo:
package com.boa.test;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
/**
* Created by boa on 2016/8/4.
@desc 用於測試""串轉Integer對象的轉換異常問題
*/
public class ExceptionForInputStringNull {
public static void main(String[] args) {
Person p = new Person();
String str = "";
//spirng的轉換器可以將""轉換成Integer的null對象.
ConversionService cs = new DefaultConversionService();
Integer integer = cs.convert(str, Integer.class);
//自行去把""轉換成integer對象會報異常
//Integer integer = Integer.valueOf(str);
//apache的轉換類也不行
//org.apache.commons.beanutils.Converter con = new IntegerConverter();
//Integer integer = (Integer)con.convert(Integer.class, str);
p.setAge(integer);
System.out.println(p.getAge());
}
}
class Person {
Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}