HandlerMethodArgumentResolver 参数解析器

 HandlerMethodArgumentResolver接口包含两个接口方法 

	
boolean supportsParameter(MethodParameter parameter);

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

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

   Class  parameterType=parameter.getParameterType(); 

return parameterType.equals(Date.class); 

 另一个为   

Object resolveArgument(MethodParameter parameter,

                           ModelAndViewContainer mavContainer,

                           NativeWebRequest webRequest,

                           WebDataBinderFactory binderFactory) throws Exception;

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

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

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

1

2

扫描二维码关注公众号,回复: 4186056 查看本文章

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>

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

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.PARAMETER)

public @interface CustomerDate {

    String value();

}

第三步: 实现HandlerMethodArgumentResolver

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);

    }
}

第四步: 控制器处理    

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

猜你喜欢

转载自blog.csdn.net/qq_36826506/article/details/82190731
今日推荐