Name for argument type [java.lang.String] not available問題分析


---恢復內容開始---

問題描述:

  開發好的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類型的參數。

---恢復內容結束---

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM