记一次SpringMVC碰到的坑详解编程语言

        在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)报错的测试代码,[email protected]
    @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
记一次SpringMVC碰到的坑详解编程语言
 
  • (3)小结
    • <1> 解决方案其实就是在参数前面加了个@RequestParam注解,并在注解中指定了参数的名字
    • <2> 在后续开发的过程,每次都加那个注解,防止项目上线就出问题


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

        上面这个解决方案是在csdn上找到的,但不够优雅,需要改好多代码。于是我自己一点点的去分析这个问题,找到了问题的根本原因。并提出了2种解决方案。
  • (1)解决的过程
    
    
由于这个问题一直困扰着我,然后网上有人说只要在javac编译时加个-g的参数就可以了。于是我就去查看maven的文档,查询怎么将
javac
编译参数给设置进去。最后终于找到了怎么加入javac编译参数配置了,然后我就去修改项目的maven的pom文件。在这个修改的过程中,我突然就发现了这个问题产生的原因。发现项目的pom文件中,maven编译插件配置地方居然有
<debug>false</debug>
,具体见下图。
    
    
    
记一次SpringMVC碰到的坑详解编程语言
        针对这个坑人的配置,我试验出了
2种解决的方案都成功了,具体如下
            
<1> 当我把这个debug的配置给删除后,项目上线就没任何问题了,[email protected]
           
<2> 
其实也可以不删除这个配置
自己添加个编译参数的配置就ok。该方法参考下图,防止图片失效,代码我也附上
                
记一次SpringMVC碰到的坑详解编程语言
        <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插件中的这些配置项的具体的用法,截图如下
记一次SpringMVC碰到的坑详解编程语言
        
        防止图片看不见,我把文字也贴上来
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,需要在网上查询下这个配置起什么作用,不然容易出问题。
 
 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15537.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论