springmvc form表單提交報400錯誤,出現400錯誤的緣由及解決方法:java
緣由:ajax
在SpringMVC中的Action中處理前臺ajax請求傳過來的json數據直接轉成對應的實體類時出錯:400 Bad Request,後臺也不報錯,400指的的是請求無效(請求有語法問題或者不能知足請求)。spring
1:通常最多見的就是後臺的實體類bean與前臺穿過的類型不匹配,如你的javabean中有定義了Date類型和int類型的成員變量,致使轉化器在把json數據轉化成bean時不能轉化。數據庫
2:log4j的配置文件裏錯誤將部分log打爲Info級別所致json
3:要返回json的卻忘了加@ResponseBodymvc
4:ajax請求的鏈接後邊忘了加參數,如url:basePath + "kscj/unbill.do?jqid="+jqidsapp
5:傳了非實體bean屬性的參數過來。數據庫設計
6:controller指定的參數名稱與前臺不一致,如:使用了@RequestParam(value="userName")而前臺必須指定該名稱函數
[java] view plain copyui
- @RequestMapping("/hello.do")
- public String hello(HttpServletRequest req,HttpServletResponse resp,@RequestParam(value="userName")String user ){
- request.setAttribute("user", user);
- return "hello";
- }
也能夠指定該參數是非必須的required=false,如:
[java] view plain copy
- @RequestMapping("/hello.do")
- public String hello(HttpServletRequest req,HttpServletResponse resp,@RequestParam(value="userName",required=false)String user){
- request.setAttribute("user", user);
- return "hello";
- }
解決方法:
1:把實體類的javabean裏邊的類型都改爲string類型,在配置SQL語句時用數據庫函數to_date或者to_number轉化的,若是再java中用到這個字符串類型的日期的話,有必要的話,就用For format=new SimpleDateFormat("yyyy-MM-dd"),format.parse()來轉換。
2:在對應的實體類的對應的非字符串類型的變量的setter方法中傳入string類型的,而後在裏邊用SimpleDateFormat或者Integer進行轉化。
如:public void setBjsj(Date bjsj) {
this.bjsj = bjsj;
}
變成
public void setBjsj(String bjsj) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
this.bjsj =sdf.parse(bjsj) ;
}
備註:
3:在實體類的日期屬性上加@DateTimeFormat(pattern="yyyy-MM-dd")註解。
Spring提供了FormattingConversionService和DefaultFormattingConversionService來完成對象的解析和格式化。
首先引入格式化jar:把Joda-Time包添加到以前的項目中,這裏用的是joda-time-2.3.jar,而後在實體類中這樣寫:
@NumberFormat(style=Style.CURRENCY)
private double money;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date date;
注意:這裏的money和date再也不是String類型,而是它們本身原本的類型。
總結:方法2和方法3我實行過,對於字段很是少的狀況下是可行的。可是對於字段很是多的狀況下,這樣錯是一件很是可怕的事情。實際開發中數據庫設計是由公司數據庫人員本身定義的,假如日期類型和數值類型,公司就明確規定使用Date和Integer類型,那麼轉換是必需要作的。