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