• HandlerMethodArgumentResolver 参数解析器


    关于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赋值,通过此小例子我们可以引申出各种实现

       

  • 相关阅读:
    小菜编程成长记(四 业务的封装)
    小菜学Flex2(二 currentState初步使用)
    小菜编程成长记(九 反射——程序员的快乐!)
    小菜编程成长记(一 面试受挫——代码无错就是好?)
    小菜编程成长记(六 关于Flex的争论)
    小菜编程成长记(三 复制VS复用)
    104种木马的清除方法
    细节决定成败打电话和发邮件的细节
    MS SQL Server查询优化方法
    美国西点军校最重要的行为准则:没有任何借口
  • 原文地址:https://www.cnblogs.com/coollijie/p/4244003.html
Copyright © 2020-2023  润新知