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