在SpringMVC中,我们Controller中接收比如表单的参数,只要保证方法的形参的名字和表单中input元素的的name一样就可以接收到参数。
        但是,我开发的一个项目一上线就报错,错误提示是接收参数失败了。报错信息如下:
java.lang.IllegalArgumentException:
Name for argument type [java.lang.String] not available, 
and parameter name information not found in class file either.
3
 
1
java.lang.IllegalArgumentException:
2
    Name for argument type [java.lang.String] not available,  
3
    and parameter name information not found in class file either.

一、解决方案一

    在我网上查阅了大量资料后解决了该问题,下面附上测试代码
  • (1)报错的测试代码,方法形参上没有用@RequestParam注解
    @RequestMapping(value = "/mytest" ,produces="text/html;charset=UTF-8" )
@ResponseBody
public String testRequestPara(String name,String password){
System.out.println(name);
return name + "--" + password;
}
6
 
1
    @RequestMapping(value = "/mytest" ,produces="text/html;charset=UTF-8" )
2
    @ResponseBody
3
    public String testRequestPara(String name,String password){
4
        System.out.println(name);
5
        return name + "--" + password;
6
    }

  • (2)修改后正常运行的测试代码
	@RequestMapping(value = "/mytest" ,produces="text/html;charset=UTF-8" )
@ResponseBody
public String testRequestPara(@RequestParam("name") String name,
@RequestParam("password") String password){
System.out.println(name);
return name + "--" + password;
}
7
 
1
    @RequestMapping(value = "/mytest" ,produces="text/html;charset=UTF-8" )
2
    @ResponseBody
3
    public String testRequestPara(@RequestParam("name") String name,
4
        @RequestParam("password") String password){
5
        System.out.println(name);
6
        return name + "--" + password;
7
    }
    造成原因是,在编译后,这个方法的形参就变成了(args0,args1)这种,所以需要用注解指定形参的名字。
    直接看下编译后的class文件,就能看到上面参数变成了args0,args1
 


  • (3)小结
    • <1> 解决方案其实就是在参数前面加了个@RequestParam注解,并在注解中指定了参数的名字。
    • <2> 在后续开发的过程,每次都加那个注解,防止项目上线就出问题




二、自己研究出来的解决方案

        上面这个解决方案是在csdn上找到的,但不够优雅,需要改好多代码。于是我自己一点点的去分析这个问题,找到了问题的根本原因。并提出了2种解决方案。
  • (1)解决的过程
        由于这个问题一直困扰着我,然后网上有人说只要在javac编译时加个-g的参数就可以了。于是我就去查看maven的文档,查询怎么将javac编译参数给设置进去。最后终于找到了怎么加入javac编译参数配置了,然后我就去修改项目的maven的pom文件。在这个修改的过程中,我突然就发现了这个问题产生的原因。发现项目的pom文件中,maven编译插件配置地方居然有<debug>false</debug>,具体见下图。
            

        针对这个坑人的配置,我试验出了2种解决的方案都成功了,具体如下
            <1> 当我把这个debug的配置给删除后,项目上线就没任何问题了,不加@RequestParam这个注解也一样可以接收到参数。

            <2> 其实也可以不删除这个配置自己添加个编译参数的配置就ok。该方法参考下图,防止图片失效,代码我也附上
                
        <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<debug>false</debug>
<!-- 加入编译参数 -->
<compilerArgument>-g</compilerArgument>
</configuration>
</plugin>
10
 
1
        <plugin>
2
            <groupId>org.apache.maven.plugins</groupId>
3
            <artifactId>maven-compiler-plugin</artifactId>
4
            <version>2.3.2</version>
5
            <configuration>
6
                <debug>false</debug>
7
                <!-- 加入编译参数  -->
8
                <compilerArgument>-g</compilerArgument>
9
            </configuration>
10
        </plugin>
        
        本项目采取的是方案一,直接把debug这个配置删了。如果用方案二,我怕别人不理解,在后续做项目时没有把代码copy完整的话,会害人。

  • (2)问题的深入分析
        在删除编译插件处debug的配置后,项目一切正常了。于是我就去查询maven插件中的这些配置项的具体的用法,截图如下
        
        防止图片看不见,我把文字也贴上来
debug	boolean	2.0	    Set to true to include debugging information in the compiled class files.
Default value is: true.
User property is: maven.compiler.debug. debuglevel String 2.1 Keyword list to be appended to the -g command-line switch. 
Legal values are none or a comma-separated list of the following keywords: lines,vars, and source. 
If debug level is not specified, by default, nothing will be appended to -g.
If debug is not turned on, this attribute will be ignored.
User property is: maven.compiler.debuglevel.
9
 
1
debug   boolean 2.0     Set to true to include debugging information in the compiled class files.
2
        Default value is: true.
3
        User property is: maven.compiler.debug.
4

5
debuglevel  String 2.1  Keyword list to be appended to the -g command-line switch. 
6
        Legal values are none or a comma-separated list of the following keywords: lines,vars, and source. 
7
        If debug level is not specified, by default, nothing will be appended to -g.
8
        If debug is not turned on, this attribute will be ignored.
9
        User property is: maven.compiler.debuglevel.
        
        特意用翻译软件翻译了一下,翻译结果如下图

将布尔设置为true,将调试信息包含在已编译的类文件中。
默认值是:true。
用户属性是:maven.编译。调试。 在-g命令行开关中附加的调试级字符串关键字列表。
法律值不是一个或一个逗号分隔的列表,它是以下关键字:行、vars和源。
如果没有指定调试级别,默认情况下,没有任何东西会附加到-g。
如果没有打开调试,这个属性将被忽略。
用户属性:maven.compiler.debuglevel。
x
 
1
将布尔设置为true,将调试信息包含在已编译的类文件中。
2
默认值是:true。
3
用户属性是:maven.编译。调试。
4

5
在-g命令行开关中附加的调试级字符串关键字列表。
6
    法律值不是一个或一个逗号分隔的列表,它是以下关键字:行、vars和源。
7
    如果没有指定调试级别,默认情况下,没有任何东西会附加到-g。
8
    如果没有打开调试,这个属性将被忽略。
9
用户属性:maven.compiler.debuglevel。

        通过上面的文档上的内容,我们可以得出结论:如果编译插件中不配置debug,那么debug默认为true,也就是会将调试信息包含在已编译的的类文件中,也就是编译时javac 后面带上了-g这个参数。而且我们没有设置debuglevel,所以编译时,-g后面没带任何值。然后通过百度一下 javac -g 就知道,此时会把所有调试信息都生成在编译的class中,包括什么源文件信息、行号信息和局部变量名称信息。有了局部变量名称信息,生成的class文件中方法的形参的名字就不会是args0、args1了,而是保持和java文件中形参的名字一样。由于形参名字没改变,所以SpringMvc就可以接收到该参数。这就解决了参数接收失败的问题

三、总结

        项目中的配置文件很重要,不知道的东西不要乱copy,需要在网上查询下这个配置起什么作用,不然容易出问题。

 
 





记一次SpringMVC碰到的坑的更多相关文章

  1. 那些在BAE上部署node.js碰到的坑

    在BAE上使用node.js半年多了,其中碰到了不少因为BAE云环境限制碰到的坑 写下来大家碰到了,也不用那么麻烦的去看好几天代码了,直接对症下药 官方公布的坑有: BAE是使用package.jso ...

  2. spring boot -- 无法读取html文件,碰到的坑

    碰到的坑,无法Controller读取html文件 1. Controller类一定要使用@Controller注解,不要用@RestController 2. resource目录下创建templa ...

  3. 运行Appium碰到的坑们

    运行Appium的时候,碰到的那些坑 1. java命令会出现error:could not open ...jvm.cfg 出现这种情况大多是因为电脑上之前安装过JDK,卸载重装之后,运行java命 ...

  4. 关于使用nodejs的mysql查询时碰到的坑

    今天在编写登录模块时,碰到一个隐蔽的坑,故记录一番 在使用Node.js的mysql模块的query方法时,查询语句使用了 `select password from login where name ...

  5. Angular新手容易碰到的坑

    在Angular群里回答新手问题一段时间了,有一些Angular方面的坑留在这里备查,希望能对各位有所帮助.这个文章将来会随时更新,不会单独开新章,欢迎各位订阅. Q1.<div ng-incl ...

  6. 记C函数指针的“小坑”

    今天遇到一个C函数指针的小坑,索性记下来. 我在a.c 文件里面,引用b.c 文件的函数声明作为指针引用 比如在a.c生命一个函数指针 typedef void (*free)(void *val) ...

  7. 微信小程序里碰到的坑和小知识

    本文作者:dongtao   来自:授权地址 本人低级程序员,以下bug不能确保在其它地方可以以相同的原因复现.同时, 出现很多bug的原因是小程序的基本知识还有编码的基本功不到位造成 路还很长,共勉 ...

  8. 记C语言浮点数运算处理 "坑" 一则

    看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; ); ; } 在你心目中, 变量 I 是怎样的结果? 如果你理所当然地认为是3的话, 那么 ...

  9. 记一个JAVA关于日期的坑

    JAVA解析日期格式代码,之前一直写成:“yyyy-MM-dd hh:mm”,比如"2016-01-18 11:00"."2016-01-18 15:00"都可 ...

随机推荐

  1. Expo大作战(一)--什么是expo,如何安装expo clinet和xde,xde如何使用

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  2. OneAPM大讲堂 | 监控数据的可视化分析神器 Grafana 的告警实践

    文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 概览 Grafana 是一个开源的监控数据分析和可视化套件.最常用于对基础设施和应用数据分析的时间序列数据进行可视化分析,也可以用 ...

  3. 2018-9 Java.lang.StackOverflowError

    问题: Java.lang.StackOverflowError at com.**Logger.**.**.StringFilter.isValueNull(StringFilter.java:81 ...

  4. MSSQL在线文件还原脚本

    在线文件还原:如果比较大的MSSQL数据库的损坏只是集中在其中某一个文件或者文件组上,使用在线文件还原技术,只是把坏掉的数据文件或者文件组重建,能节约很多时间.以下是测试脚本(假设损坏的文件时Trn0 ...

  5. 一张思维导图纵观MySQL数据安全体系!

    杨奇龙 2017-06-29 09:52:10 786 作者介绍 杨奇龙,前阿里数据库团队资深DBA,主要负责淘宝业务线,经历多次双十一,有海量业务访问DB架构设计经验.目前就职于有赞科技,负责数据库 ...

  6. C/C++控制Windows关机/注销/重启的正确姿势

    简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...

  7. Linux运维之--zabbix使用(实时更新)

    之前安装的是zabbix3.x版本,今天尝试安装zabbix4.2版本,并做个总结.建议生产环境还是使用3.4版本比较好,因为4.2版本上可能语法又增加了一些,所以建议使用熟练的版本 1.首先是安装z ...

  8. linux结束程序内存不会马上释放的解决方法

      Linux下频繁读写文件时,内存资源被耗尽,当程序结束后,内存不会释放需要清除缓存.Linux缓存有dentry,buffer cache,page cache. 注:Dentry用来加速文件路径 ...

  9. Python csv.md

    csv csv模块可以用于处理从电子表格和数据库导出的数据到带有字段和记录格式的文本文件,通常称为逗号分隔值(csv)格式,因为逗号通常用于分隔记录中的字段. Reading csv.reader(c ...

  10. sql 一个表的字段更新至另一个字段的方法

    update Lc_Taxs set TaxMember = convert(int,Lc_Taxs2.TaxNo)  from Lc_Taxs a,(select * from Lc_Taxs ) ...