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

   

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值