zoukankan      html  css  js  c++  java
  • 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类型的参数。

    ---恢复内容结束---

      

  • 相关阅读:
    SQL server 导出平面文件时出错: The code page on Destination
    中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030
    C# DataTable 转 List(大家进来讨论讨论)
    CSS3圆角气泡框,评论对话框
    WinForm 换行问题 textbox (转)
    Nhibernate 多对多级联删除
    JS、C# 去除html标签
    Nhibernate 多对多级联更新
    Ext.Ajax.request()方法和FormPanel.getForm().submit()方法,都返回success()方法的差异
    ExtJs 4.2.1 报错:Uncaught TypeError: Cannot call method 'getItems' of null
  • 原文地址:https://www.cnblogs.com/AI-U/p/10535762.html
Copyright © 2011-2022 走看看