• RequestParam注解的Url参数被省略时该如何处理


    RequestParam注解的Url参数被省略时该如何处理


    1、RequestParam的用法

    ====================

    RequestParam注解可以把包含在Url中的参数映射到Url处理方法的方法参数。比如,Url是http://domain:port/index?action=xxx&notIncludeTypeId=xxx,这个Url中包含了两个参数,如果要在处理这个Url的方法中取得这两个参数,那么就要在Url的响应方法的方法参数前面用RequestParam来映射Url中参数到方法参数。

    如下,代码中,Url http://domain:port/index?action=xx&notIncludeTypeId=xx的响应方法是index方法。

    //Url :http://domain:port/index?action=xxx&notIncludeTypeId=xx 的响应方法
    @RequestMapping(value = "/index")
    public String index(
    @RequestParam(value = "action", required = false) String action, @RequestParam(value = "notIncludeTypeId", required = false) int notIncludeTypeId)
    {
        // .... 处理代码
    }

    这里就通过RequestParam注解把Url中传来的参数映射成了index方法的方法参数,这样方法参数action就和Url参数action对应,方法参数notIncludeTypeId和Url参数notIncludeTypeId对应。Url中action的值会在触发Url的时候赋给index方法参数action,而Url中notIncludeTypeId的值会赋给index方法的notIncludeTypeId参数。

    RequestParam可以有如下两种形式:

    @RequestParam String action

    这种方式来映射Url参数和方法参数的时候,Url中必须有名字为action的参数,才能实现action参数映射到方法参数action。就是说Url的参数名必须和方法的参数名一致,同时Url中不允许省略要求的参数,比如这里的action参数是不能省略的。

    @RequestParam(value="action", required = false | true) String action

    这种方式通过value来指明了要把Url中参数名为action的Url参数映射到方法参数action上,同时指明了Url中action参数是否可以省略。如果required的值是false,那么请求Url中可以省略action参数,此时方法参数action会被赋值为null。如果required的值是true,那么请求Url中一定不能省略action参数。

    相对来讲这种方式更好一点,因为指示的更为明确。在这种方式中Url中的参数名字和方法的参数名字也可以不一致。

    2、当RequestParam映射的Url参数在请求Url中被省略时如何处理

    ====================================================

    如果Request注解过的Url参数在请求的时候被省略了,那么对应方法参数就会被赋值为null。

    比如,上面的代码中的action参数是可以省略的,如果请求的时候被省略了,那么action的值就会是null。

    这个默认赋值规则要求所有与Url参数对应的方法参数必须是类类型的,而不能是primitive 类型的,因为当Url中的参数一旦省略,那么系统就会给对应的方法参数赋值null,而primitive是不能被赋值为null的。

    可是如果,Url中的参数就应该对应一个primitive类型的方法参数的时候,应该如何处理呢?答案是,这是应该使用primitive type对应的包装类型,然后在接下来的程序中再从包装类型的方法参数中取出primitive类型的值,做进一步的处理。

    在上面的示例代码中,由于action参数和notIncludeTypeId参数都可以省略,而notIncludeTypeId参数又是int类型的,所以当请求Url中省略了notIncludeTypeId的时候,系统就会报如下的错误。

    错误信息:

    Optional int parameter 'notIncludeTypeId' is not present 
    but cannot be translated into a null value due to being declared as a primitive type. 
    Consider declaring it as object wrapper for the corresponding primitive type.

    这里的错误提示信息说的很明白,可选参数notIncludeTypeId不存在,而且又不能被转换为null,因为被声明为primitive类型了。建议考虑对应的包装类型。

    所以,这里的解决方法也很简单:使用包装类型代替基本类型,如使用“Integer”代替“int”。

  • 相关阅读:
    单例模式
    eclipse部署web项目至本地的tomcat但在webapps中找不到
    使用 google gson 转换Timestamp为JSON字符串
    前端JS对后台传递的timestamp的转换
    2018第15周总结
    Tomcat的最大并发数
    平台对接的另外一种模式
    系统间数据交换的5种方式
    Spring Boot条件注解
    Spring Data JPA 和MyBatis比较
  • 原文地址:https://www.cnblogs.com/zhangzl419/p/7345167.html
Copyright © 2020-2023  润新知