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

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM