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类型的参数。

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

      

  • 相关阅读:
    匿名方法
    优化从 App.config 读取配置文件
    显示(explicit )与隐式(implicit)转换操作符
    ( 转 ) 聊一聊C#的Equals()和GetHashCode()方法
    协变和逆变
    html frameset的介绍
    html <frame>标签使用
    html <table>标签信息
    html 列表相关信息
    html <form>相关表单
  • 原文地址:https://www.cnblogs.com/AI-U/p/10535762.html
Copyright © 2011-2022 走看看