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

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

 

  

转载于:https://www.cnblogs.com/AI-U/p/10535762.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值