---恢复内容开始---
问题描述:
开发好的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类型的参数。
---恢复内容结束---