RequestParam注解的Url参数被省略时该如何处理
RequestParam注解的Url参数被省略时该如何处理
1、RequestParam的用法
====================
RequestParam注解可以把包含在Url中的参数映射到Url处理方法的方法参数。比如,Url是http://domain:port/index?action=xxx¬IncludeTypeId=xxx,这个Url中包含了两个参数,如果要在处理这个Url的方法中取得这两个参数,那么就要在Url的响应方法的方法参数前面用RequestParam来映射Url中参数到方法参数。
如下,代码中,Url http://domain:port/index?action=xx¬IncludeTypeId=xx的响应方法是index方法。
//Url :http://domain:port/index?action=xxx¬IncludeTypeId=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”。
RequestParam注解的Url参数被省略时该如何处理的更多相关文章
- 【转】@RequestParam @RequestBody @PathVariable 等参数绑定注解详解
@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 2014-06-02 11:24 23683人阅读 评论(2) 收藏 举报 目录(?)[+] 引言 ...
- springMVC --@RequestParam注解(后台控制器获取参数)
在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取. 1.获 ...
- Angularjs中使用$location获取url参数时,遇到的坑~~~
今天在开发时候,需要用到Angularjs1.4.6获取url参数,网上查了一下,有部分文章提到用$location来获取.大致方法如下 var app = angular.module('myApp ...
- struts2注解redirect传递参数解决方案时,中国的垃圾问题
struts2注解redirect传递参数解决方案时,中国的垃圾问题 试过很多方法 tomcat 编码 .字符串转换 .URLEncoder .. 但是,没有解决方案,然后仔细阅读 stru ...
- SpringMVC第四篇【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam注解】
参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定- 默认支持的参数类型 从上面的用法我们可以发现,我们可以使用req ...
- javascript之url转义escape()、encodeURI()和decodeURI(),ifram父子传参参数有中文时出现乱码
ifram父子传参参数有中文时出现乱码,可先在父级页面用encodeURI转义,在到子页面用进行decodeURI()解码 我们可以知道:escape()除了 ASCII 字母.数字和特定的符号外,对 ...
- 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题
为什么返回的数据前面有callback? 这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...
- js 路径改变时获取url参数
当我们在使用react或vue的router作路由跳转时,为了保持菜单与地址栏状态一致,我们可以使用window.onhashchange捕获#后面的变化 window.onhashchange = ...
- @RequestParam注解
SpringMVC的参数指定注解:@RequestParam,有下面四个方法: value 参数绑定,value里写的是URL里参数名称 name 同上 required 是否必需参数,默认为tr ...
随机推荐
- DataV纪录
DataV 是阿里云出品的拖拽式可视化工具,专精于业务数据与地理信息融合的大数据可视化.
- 开源项目Universal Image Loader for Android 说明文档 (1) 简介
When developing applications for Android, one often facesthe problem of displaying some graphical ...
- 分布式缓存之memcached--命令测试
1. 启动Memcache常用参数 -p <num> 设置TCP端口号(默认设置为: ) -U <num> UDP监听端口(默认: , 时关闭) -l <ip_addr& ...
- kali视频(21-25)学习
第六周 kali视频(21-25)学习 21.密码攻击之在线攻击工具 22.密码攻击之离线攻击工具(一) 23.密码攻击之离线攻击工具(二) 24.密码攻击之哈希传递攻击 25.无线安全分析工具 21 ...
- 实体对象,List泛型 转换为DataTable
/// <summary> /// 实体对象转换DataTable /// </summary> /// <param name ...
- matlab中freqz的用法以及多项式的展开
对于一个变量a,matlab中定义需要这样 syms a: 定义之后就可以写由变量组成的式子,比如 c=(1+a^-1)^5; 可以用expand(c) 就能把c展开成多项式,每一项的系数就可以看到. ...
- 因实现本地浏览器访问nginx修改配置文件后,安装vsftpd失败
解决方法如下(修改dns配置) vi /etc/resolv.conf 在此文件最后加入:nameserver 8.8.8.8 如果没有vi编辑器可用: echo "nameserver 8 ...
- input子系统框架
废话不多说,直接进入主题.在驱动insmod后,我们应用层对input设备如何操作?以下以全志a64为实例. 在/dev/input/eventX下(X的形成为后续会分析),是内核把接口暴露给应用层, ...
- 插入排序的JavaScript实现
思想 每次在现有已经排好的数组的基础上排入一个新的数组项. 先把第一项看做是已经排好的,第二项应该排在第一项之前还是之后呢?当前两项排好后,第三项应该排在这已排好的两项的之前还是之后还是中间呢?当前三 ...
- 【openCV学习笔记】【3】高斯模糊一张图片(_cvSmooth相关编译错误)
代码如下: #include <iostream> #include <opencv/highgui.h> #include <opencv/cv.h> void ...