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