---恢復內容開始---
問題描述:
開發好的JavaWeb程序,
直接在Eclipse中啟動,沒有任何問題,
在本地進行Ant編譯時,發布到WebSphere中沒有任何問題。
使用命令行ant -f 或者Linux上javac等進行編譯時,發布沒有問題,但是有些功能會報如標題所示的錯誤。
原因:
在使用SpringMVC綁定基本類型(如String,Integer等)參數時,應通過@RequestParam注解指定具體的參數名稱,
否則,當源代碼在非debug模式下編譯后,運行時會引發HandlerMethodInvocationException異常,
這是因為只有在debug模式下編譯,其參數信息才會拷貝到生成的class文件內。
譬如如下代碼會引發異常:
@RequestMapping(value = "/security/login", method = RequestMethod.POST) public ModelAndView login(@RequestParam String userName, @RequestParam String password, HttpServletRequest request) { ......................
使用Eclipse進行編譯沒有問題是因為在 properties->Java Compiler 頁面, Classfile Generation選項下,有個“Add variable attribute to generated class files(used by the debugger)”選項,Eclipse本地啟動工程是默認以debug模式啟動的,會將參數信息加載到生成的class文件內。
在本地進行編譯沒有問題是因為本地的build.xml文件中 javac參數 debug 賦值為on(或者true),所以也是以debug模式進行編譯的。
而使用ant -f或Linux在git上進行編譯時,build.xml文件中debug模式的賦值寫錯了。。。。。所以根本沒起作用。
還有一種修改方式:
為每個參數指定具體的參數名,參數名要與前台上送的參數的參數名一致,可以不與后台函數中實際接收的參數名一致。
如下面的userName指定的參數名為userNameHahaha,前台上送參數時參數名也必須是userNameHahaha。
這樣即使不在debug模式下編譯,也能正常訪問。
RequestParam其他參數:
required:是否必須上送此參數,默認為TRUE
defaultvalue:是否有默認值。
@RequestMapping(value = "/security/login", method = RequestMethod.POST) public ModelAndView login(@RequestParam(value = "userNameHahaha") String userName, @RequestParam("password") String password, HttpServletRequest request) { ......................
注意:如果參數是原子類型(int ,bool等)則必須賦值,否則拋出異常; 封裝類型(Boolean,類等)默認為false和null。
注意:如果傳遞的參數為在傳遞參數的時候如果是url?userName=zhangsan&userName=wangwu時,效果類似於在傳遞參數的時候如果是url?userName=zhangsan,wangwu,多個參數之間使用逗號進行分隔,應該使用如下方式進行接收參數:
即不同參數之間使用&進行分隔,同一參數之間使用”,逗號“進行分隔
public String requestparam8(@RequestParam(value="userName") String [] userNames) 或者是: public String requestparam8(@RequestParam(value="list") List<String> list)
PathVariable也可以進行參數的綁定:
不同的是PathVariable是在RequestMapping中指定參數名的{id}
@RequestMapping(value = "/auditTaobao/{id}") public void doAuditTaobao(@PathVariable Integer id){ taobaoService.auditTaobao(id); }
RequestParam:請求參數,接收/emps?pageNo=2類型的參數。
PathVariable: 路徑變量,獲取url的一部分作為參數,接收/emp/7類型的參數。
---恢復內容結束---