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

时间:2024-04-06 10:07:23

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”。