1. 程式人生 > >HandlerMethodArgumentResolver 引數解析器

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

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賦值,通過此小例子我們可以引申出各種實現