关于springMvc中的参数解析器

springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器)

HandlerMethodArgumentResolver接口包含两个接口方法

1
boolean supportsParameter(MethodParameter parameter);

MethodParameter方法参数对象 通过它可以获取该方法参数上的一些信息 如方法参数中的注解信息等

通过该方法我们如果需要对某个参数进行处理  只要此处返回true即可 如对Date类型数据处理的话

   Class  parameterType=parameter.getParameterType();

return parameterType.equals(Date.class);

另一个为

1
2
3
4
Object resolveArgument(MethodParameter parameter,
                           ModelAndViewContainer mavContainer,
                           NativeWebRequest webRequest,
                           WebDataBinderFactory binderFactory) throws Exception;

该方法就是对参数的解析,返回的Object会自动赋值到参数对象中

实例:  自定义一个日期处理注解,通过一个HandlerMethodArgumentResolver来解析

第一步:为HandlerAdapter配置一个自定义的HandlerMethodArgumentResolver

1
2
3
4
5
<mvc:annotation-driven conversion-service="conversionService">
        <mvc:argument-resolvers>
          <bean class="com.car.admin.controller.CustomerHandlerMethodArgumentResolver"></bean>
        </mvc:argument-resolvers>
 </mvc:annotation-driven>

第二步:定义一个日期注解

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface CustomerDate {
    String value();
}

第三步: 实现HandlerMethodArgumentResolver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class CustomerHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
 
    public Object resolveArgument(MethodParameter parameter,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory) throws Exception {
 
        Annotation[]  methodAnnotations= parameter.getParameterAnnotations();
        for(Annotation  annotation:methodAnnotations){
            if(annotation instanceof CustomerDate){
                CustomerDate  customerDate=(CustomerDate)annotation;
                String dataStringValue=customerDate.value();
                SimpleDateFormat  formater=new SimpleDateFormat("yyyy-MM-dd HH:mm");
                return  formater.parse(dataStringValue);
            }
        }
        return null;
    }
 
    @SuppressWarnings("unchecked")
    public boolean supportsParameter(MethodParameter parameter) {
        Class  parameterType=parameter.getParameterType();
        return parameterType.equals(Date.class);
    }
 
}

第四步: 控制器处理

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/user_list")
    @ResponseBody
    public Map <String,Object> userList(@CustomerDate(value = "2015-02-01 03:55") Date date,HttpServletRequest  request,@PageableDefault(page=0,size=10)  Pageable pageable,Model modelMap) {
        Map<String,String[]>  params=HttpUtils.getParameterValuesMap(request,Constants.SEARCH_PREFIX);
        Page<User>  userPage=userService.findPage(pageable,params);
        Map<String,Object>   results=new  HashMap<String,Object> ();
        results.put("total", userPage.getTotalElements());
        results.put("rows", userPage.getContent());
        return results;
    }      

通过上面的处理:     通过CustomerDate 注解 我们可以通过value来制定具体的日期,并且会自动为date赋值,通过此小例子我们可以引申出各种实现

转自 https://www.cnblogs.com/coollijie/p/4244003.html

HandlerMethodArgumentResolver 参数解析器的更多相关文章

  1. springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)

    HandlerMethodArgumentResolver是用来为处理器解析参数的,主要用在HandlerMethod中,每个Resolver对应一种类型的参数,其实现类特别的多. HandlerMe ...

  2. 自定义HandlerMethodArgumentResolver参数解析器和源码分析

    在初学springmvc框架时,我就一直有一个疑问,为什么controller方法上竟然可以放这么多的参数,而且都能得到想要的对象,比如HttpServletRequest或HttpServletRe ...

  3. springMVC源码分析--RequestParamMethodArgumentResolver参数解析器(三)

    之前两篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)和springMVC源码解析--HandlerMethodArgumentResol ...

  4. springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)

    上一篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)中我们已经介绍了参数解析相关的东西,并且也提到了HandlerMethodArgume ...

  5. 实现自定义的参数解析器——HandlerMethodArgumentResolver

    1.为什么需要自己实现参数解析器 我们都知道在有注解的接口方法中加上@RequestBody等注解,springMVC会自动的将消息体等地方的里面参数解析映射到请求的方法参数中. 如果我们想要的信息不 ...

  6. 一步一步自定义SpringMVC参数解析器

    随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...

  7. SpringMVC自动封装List对象 —— 自定义参数解析器

    前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.sp ...

  8. SpringBoot自定义参数解析器

    一.背景 平常经常用 @RequestParam注解来获取参数,然后想到我能不能写个自己注解获取请求的ip地址呢?就像这样 @IP String ip 二.分析 于是开始分析 @RequestPara ...

  9. SpringMVC 自定义参数解析器.

    一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...

随机推荐

  1. 美食节(bzoj 2879)

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  2. pat 甲级 1072. Gas Station (30)

    1072. Gas Station (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A gas sta ...

  3. eclipse去除所有调试断点 (转)

    今天调试的时候发现之前加了太多断点,想去除所有断点,才想起来一直都没有使用过这个功能,放狗搜了一下,很快找到,记录一下. 方法一: 在工作界面,点window菜单栏,选中Preperences,在Ge ...

  4. formal parameter

    formal parameter : [3.16] object declared as part of a function declaration or definition that acqui ...

  5. hdu 3639 有向图缩点+建反向图+搜索

    题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人. 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计 ...

  6. Windows下Mysql数据库服务的关闭和重启

    有时我们在手动修改了Mysql的配置文件之后,我们要重启Mysql服务才能使之生效,这里提供几种重启方法: 1.windows下重新启动mysql5的方法:在安装mysql时系统会添加服务,可以通过管 ...

  7. Cryptography I 学习笔记 --- 使用分组密码

    1. 如果加密算法是确定性的(相同的明文产生相同的密文),那么它对于选择明文攻击是不安全的 2. 随机化加密,每次对相同的密文加密,会产生不同的结果 AES加密模式 ecb:明文分块计算,块与块之间没 ...

  8. Java线程池ThreadPoolExecutor类源码分析

    前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...

  9. 无法获得VMCI 驱动程序的版本: 句柄无效。

    写在前面 最近在电脑上安装了VMware虚拟机,在安装系统的使用,总提示错误“无法获得VMCI 驱动程序的版本: 句柄无效.”.最近刚买的电脑,也不会是系统的问题吧,为了装个虚机,总不能重装系统吧,没 ...

  10. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...