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 ...
随机推荐
- React 源码剖析系列 - 生命周期的管理艺术
目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期 ...
- 使用Python 2.7实现的垃圾短信识别器
最近参加比赛,写了一个垃圾短信识别器,在这里做一下记录. 官方提供的数据是csv文件,其中训练集有80万条数据,测试集有20万条数据,训练集的格式为:行号 标记(0为普通短信,1为垃圾短信) 短信内容 ...
- 前端画图之iphoneSE主屏
今天逛园子,无意间看到一个用div+css画的Macbook Air的博客,瞬间想到很久之前我也做过类似的事, 而且,当时写完之后,真的是成就感爆棚啊!我去开源中国上翻到了我当时贴的源码,当时是在手机 ...
- tf随笔-5
# -*- coding: utf-8 -*-import tensorflow as tfw1=tf.Variable(tf.random_normal([2,6],stddev=1))w2=tf. ...
- warning MSB8004: Output Directory does not end with a trailing slash.
当在VC里编译时,发现这个警告,就是说设置的目录参数不是以反斜杠结束的目录名称,如下: 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V ...
- Python判断unicode是汉字,数字,英文,或者其他字符
功能: 判断unicode是否是汉字,数字,英文,或者是否是(汉字,数字和英文字符之外的)其他字符. 全角.半角符号相互转换. 全角.半角? 全角--指一个字符占用两个标准字符位置. 汉字字符和规定了 ...
- Visual Studio和Sublime Text全系列激活码
自己经常用,做个备份 VS2012 Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥: YKCW6-BPFPF-BT8C9-7DCTH-QXGWC Mi ...
- .NET面试题总结
1.c#垃圾回收机制 从以下方面入手展开: 1.压缩合并算法 2.代的机制 3.GC调用终结器 2.委托和事件 先说它的定义:委托的本质是类,类型安全的指针,然后从用途上考虑,事件是包装的委托 ...
- 实体对象,List泛型 转换为DataTable
/// <summary> /// 实体对象转换DataTable /// </summary> /// <param name ...
- 区分/不区分大小写的比较,查找字符串在另一字符串中的位置,字符串开头是否包括另一字符串 hasPrefix
NSString *str; // 使用stringWithFormat生成一格式化字符串 str = [NSString stringWithFormat:@"This is %@&quo ...